tor-browser

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

scenarios_async.rs (3613B)


      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 #[tokio::test]
     21 async fn scenarios_async() {
     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(), false, 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
     61                        .format_value(&query.input.id, args.as_ref(), &mut errors)
     62                        .await;
     63                    if no_bundles || query.exceptional_context.causes_failed_value_lookup() {
     64                        assert!(v.is_none());
     65                        if no_bundles {
     66                            continue;
     67                        }
     68                    } else {
     69                        assert_eq!(v.unwrap(), value.as_str())
     70                    }
     71                }
     72            }
     73 
     74            if query.exceptional_context.causes_reported_format_error() {
     75                assert!(
     76                    errors.len() > errors_start_len,
     77                    "expected reported errors for query {:#?}",
     78                    query
     79                );
     80            } else {
     81                assert_eq!(
     82                    errors.len(),
     83                    errors_start_len,
     84                    "expected no reported errors for query {:#?}",
     85                    query
     86                );
     87            }
     88        }
     89 
     90        if scenario
     91            .queries
     92            .iter()
     93            .any(|query| query.exceptional_context.missing_required_resource())
     94        {
     95            assert!(
     96                !env.errors().is_empty(),
     97                "expected errors for scenario {{ {} }}, but found none",
     98                scenario.name
     99            );
    100        } else {
    101            assert!(
    102                env.errors().is_empty(),
    103                "expected no errors for scenario {{ {} }}, but found {:#?}",
    104                scenario.name,
    105                env.errors()
    106            );
    107        }
    108    }
    109 }