tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

scenarios_sync.rs (3579B)


      1 use fluent_bundle::FluentArgs;
      2 use fluent_fallback::Localization;
      3 use fluent_testing::get_scenarios;
      4 use l10nregistry::fluent::FluentBundle;
      5 use l10nregistry::registry::BundleAdapter;
      6 use l10nregistry_tests::{RegistrySetup, TestFileFetcher};
      7 
      8 #[derive(Clone)]
      9 struct ScenarioBundleAdapter {}
     10 
     11 impl BundleAdapter for ScenarioBundleAdapter {
     12    fn adapt_bundle(&self, bundle: &mut FluentBundle) {
     13        bundle.set_use_isolating(false);
     14        bundle
     15            .add_function("PLATFORM", |_positional, _named| "linux".into())
     16            .expect("Failed to add a function to the bundle.");
     17    }
     18 }
     19 
     20 #[test]
     21 fn scenarios_sync() {
     22    use fluent_testing::scenarios::structs::Scenario;
     23    let fetcher = TestFileFetcher::new();
     24 
     25    let scenarios = get_scenarios();
     26 
     27    let adapter = ScenarioBundleAdapter {};
     28 
     29    let cannot_produce_bundle = |scenario: &Scenario| {
     30        scenario
     31            .queries
     32            .iter()
     33            .any(|query| query.exceptional_context.blocks_bundle_generation())
     34    };
     35 
     36    for scenario in scenarios {
     37        println!("scenario: {}", scenario.name);
     38        let setup: RegistrySetup = (&scenario).into();
     39        let (env, reg) = fetcher.get_registry_and_environment_with_adapter(setup, adapter.clone());
     40 
     41        let loc = Localization::with_env(scenario.res_ids.clone(), true, env.clone(), reg);
     42        let bundles = loc.bundles();
     43        let no_bundles = cannot_produce_bundle(&scenario);
     44 
     45        let mut errors = vec![];
     46 
     47        for query in scenario.queries.iter() {
     48            let errors_start_len = errors.len();
     49 
     50            let args = query.input.args.as_ref().map(|args| {
     51                let mut result = FluentArgs::new();
     52                for arg in args.as_slice() {
     53                    result.set(arg.id.clone(), arg.value.clone());
     54                }
     55                result
     56            });
     57 
     58            if let Some(output) = &query.output {
     59                if let Some(value) = &output.value {
     60                    let v = bundles.format_value_sync(&query.input.id, args.as_ref(), &mut errors);
     61                    if no_bundles || query.exceptional_context.causes_failed_value_lookup() {
     62                        assert!(v.is_err() || v.unwrap().is_none());
     63                        if no_bundles {
     64                            continue;
     65                        }
     66                    } else {
     67                        assert_eq!(v.unwrap().unwrap(), value.as_str())
     68                    }
     69                }
     70            }
     71 
     72            if query.exceptional_context.causes_reported_format_error() {
     73                assert!(
     74                    errors.len() > errors_start_len,
     75                    "expected reported errors for query {:#?}",
     76                    query
     77                );
     78            } else {
     79                assert_eq!(
     80                    errors.len(),
     81                    errors_start_len,
     82                    "expected no reported errors for query {:#?}",
     83                    query
     84                );
     85            }
     86        }
     87 
     88        if scenario
     89            .queries
     90            .iter()
     91            .any(|query| query.exceptional_context.missing_required_resource())
     92        {
     93            assert!(
     94                !env.errors().is_empty(),
     95                "expected errors for scenario {{ {} }}, but found none",
     96                scenario.name
     97            );
     98        } else {
     99            assert!(
    100                env.errors().is_empty(),
    101                "expected no errors for scenario {{ {} }}, but found {:#?}",
    102                scenario.name,
    103                env.errors()
    104            );
    105        }
    106    }
    107 }