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 }