@@ -176,172 +176,30 @@ fn subtract_30_months(date: &str) -> Result<String, crate::error::Error> {
176176
177177#[ cfg( test) ]
178178mod tests {
179- use super :: * ;
180- use browserslist_data:: baseline;
181- use std:: collections:: HashMap ;
182- use std:: process:: Command ;
179+ use crate :: test:: run_compare;
180+ use crate :: opts:: Opts ;
183181 use test_case:: test_case;
184182
185- /// Run a Node.js snippet and return stdout lines.
186- fn node_output ( script : & str ) -> Vec < String > {
187- let out = Command :: new ( "node" )
188- . arg ( "-e" )
189- . arg ( script)
190- . output ( )
191- . expect ( "node must be available" ) ;
192- assert ! (
193- out. status. success( ) ,
194- "node failed: {}" ,
195- String :: from_utf8_lossy( & out. stderr)
196- ) ;
197- String :: from_utf8 ( out. stdout )
198- . unwrap ( )
199- . lines ( )
200- . filter ( |l| !l. is_empty ( ) )
201- . map ( str:: to_owned)
202- . collect ( )
203- }
204-
205- /// Call getCompatibleVersions() and return a map of caniuse_browser -> min_version.
206- fn js_min_versions ( js_opts : & str ) -> HashMap < String , String > {
207- let opts_str = if js_opts. is_empty ( ) {
208- "suppressWarnings: true" . to_owned ( )
209- } else {
210- format ! ( "{js_opts}, suppressWarnings: true" )
211- } ;
212- let script = format ! (
213- r#"
214- const {{ getCompatibleVersions }} = require('./node_modules/baseline-browser-mapping');
215- const map = {{chrome:'chrome',chrome_android:'and_chr',edge:'edge',firefox:'firefox',firefox_android:'and_ff',safari:'safari',safari_ios:'ios_saf'}};
216- const r = getCompatibleVersions({{ {opts_str} }});
217- r.filter(e=>map[e.browser]).forEach(e => console.log(map[e.browser] + ' ' + e.version));
218- "#
219- ) ;
220- node_output ( & script)
221- . into_iter ( )
222- . map ( |line| {
223- let ( b, v) = line. split_once ( ' ' ) . unwrap ( ) ;
224- ( b. to_owned ( ) , v. to_owned ( ) )
225- } )
226- . collect ( )
227- }
228-
229- /// Verify that the minimum version our data returns for each browser matches
230- /// what getCompatibleVersions() from the JS library reports.
231- fn assert_min_versions_match (
232- label : & str ,
233- expected : & HashMap < String , String > ,
234- get_min : impl Fn ( & str ) -> Option < & ' static str > ,
235- ) {
236- for ( browser, js_version) in expected {
237- let rust_version = get_min ( browser) . unwrap_or_else ( || {
238- panic ! ( "[{label}] {browser}: Rust returned None, JS expected {js_version}" )
239- } ) ;
240- let js_v: Version = js_version. parse ( ) . unwrap_or_default ( ) ;
241- let rust_v: Version = rust_version. parse ( ) . unwrap_or_default ( ) ;
242- assert_eq ! (
243- js_v, rust_v,
244- "[{label}] {browser}: Rust min={rust_version}, JS min={js_version}"
245- ) ;
246- }
247- assert_eq ! (
248- expected. len( ) ,
249- 7 ,
250- "[{label}] expected 7 core browsers, got {}" ,
251- expected. len( )
252- ) ;
253- }
254-
255- #[ test]
256- fn widely_min_versions_match_js ( ) {
257- let expected = js_min_versions ( "" ) ;
258- assert_min_versions_match ( "widely" , & expected, |b| {
259- baseline:: get_baseline_widely_min_version ( b)
260- } ) ;
261- }
262-
263- #[ test_case( 2015 ; "year_2015" ) ]
264- #[ test_case( 2016 ; "year_2016" ) ]
265- #[ test_case( 2017 ; "year_2017" ) ]
266- #[ test_case( 2018 ; "year_2018" ) ]
267- #[ test_case( 2019 ; "year_2019" ) ]
268- #[ test_case( 2020 ; "year_2020" ) ]
269- #[ test_case( 2021 ; "year_2021" ) ]
270- #[ test_case( 2022 ; "year_2022" ) ]
271- #[ test_case( 2023 ; "year_2023" ) ]
272- #[ test_case( 2024 ; "year_2024" ) ]
273- fn year_min_versions_match_js ( year : u16 ) {
274- let expected = js_min_versions ( & format ! ( "targetYear: {year}" ) ) ;
275- assert_min_versions_match ( & format ! ( "year {year}" ) , & expected, |b| {
276- baseline:: get_baseline_year_min_version ( year, b)
277- } ) ;
278- }
279-
280- #[ test_case( "2023-04-05" ; "date_2023_04_05" ) ]
281- #[ test_case( "2021-01-01" ; "date_2021_01_01" ) ]
282- #[ test_case( "2024-06-15" ; "date_2024_06_15" ) ]
283- fn widely_on_date_min_versions_match_js ( date : & str ) {
284- let expected = js_min_versions ( & format ! ( "widelyAvailableOnDate: '{date}'" ) ) ;
285- let cutoff = subtract_30_months ( date) . unwrap ( ) ;
286- assert_min_versions_match ( & format ! ( "date {date}" ) , & expected, |b| {
287- baseline:: get_baseline_cutoff_date_min_version ( & cutoff, b)
288- } ) ;
289- }
290-
291183 #[ test_case( "baseline widely available" ; "widely" ) ]
292- #[ test_case( "baseline 2020" ; "year 2020" ) ]
293- #[ test_case( "baseline 2022" ; "year 2022" ) ]
294- #[ test_case( "baseline 2015" ; "year 2015" ) ]
295184 #[ test_case( "BASELINE WIDELY AVAILABLE" ; "case insensitive widely" ) ]
296- #[ test_case( "baseline widely available on 2023-04-05" ; "widely on date" ) ]
297- fn valid_queries_return_results ( query : & str ) {
298- let results = crate :: resolve ( [ query] , & Opts :: default ( ) ) . unwrap ( ) ;
299- assert ! (
300- !results. is_empty( ) ,
301- "expected non-empty results for {query:?}"
302- ) ;
303- }
304-
305185 #[ test_case( "baseline newly available" ; "newly" ) ]
306- #[ test_case( "Baseline Newly Available" ; "case insensitive newly" ) ]
307- fn valid_queries_no_error ( query : & str ) {
308- // "newly" min versions may be ahead of the caniuse data, so results can be empty
309- crate :: resolve ( [ query] , & Opts :: default ( ) ) . expect ( "query should not error" ) ;
310- }
311-
312- #[ test_case( "baseline 2022 with downstream" ; "year_downstream" ) ]
313- #[ test_case( "baseline widely available with downstream" ; "widely_downstream" ) ]
314- fn valid_queries_with_downstream ( query : & str ) {
315- let results = crate :: resolve ( [ query] , & Opts :: default ( ) ) . unwrap ( ) ;
316- assert ! (
317- !results. is_empty( ) ,
318- "expected non-empty results for {query:?}"
319- ) ;
320- // Should have more results than without downstream
321- let without = crate :: resolve (
322- [ query. replace ( " with downstream" , "" ) . as_str ( ) ] ,
323- & Opts :: default ( ) ,
324- )
325- . unwrap ( ) ;
326- assert ! (
327- results. len( ) > without. len( ) ,
328- "downstream should add browsers: got {}, without got {}" ,
329- results. len( ) ,
330- without. len( )
331- ) ;
332- }
333-
334- #[ test_case( "baseline 2020 with downstream including kaios" ; "year_downstream_kaios" ) ]
335- fn valid_queries_with_kaios ( query : & str ) {
336- let results = crate :: resolve ( [ query] , & Opts :: default ( ) ) . unwrap ( ) ;
337- assert ! (
338- !results. is_empty( ) ,
339- "expected non-empty results for {query:?}"
340- ) ;
341- // Should include kaios
342- assert ! (
343- results. iter( ) . any( |d| d. name( ) == "kaios" ) ,
344- "expected kaios in results"
345- ) ;
186+ #[ test_case( "baseline 2015" ; "year 2015" ) ]
187+ #[ test_case( "baseline 2016" ; "year 2016" ) ]
188+ #[ test_case( "baseline 2017" ; "year 2017" ) ]
189+ #[ test_case( "baseline 2018" ; "year 2018" ) ]
190+ #[ test_case( "baseline 2019" ; "year 2019" ) ]
191+ #[ test_case( "baseline 2020" ; "year 2020" ) ]
192+ #[ test_case( "baseline 2021" ; "year 2021" ) ]
193+ #[ test_case( "baseline 2022" ; "year 2022" ) ]
194+ #[ test_case( "baseline 2023" ; "year 2023" ) ]
195+ #[ test_case( "baseline 2024" ; "year 2024" ) ]
196+ #[ test_case( "baseline widely available on 2021-01-01" ; "widely on date 2021-01-01" ) ]
197+ #[ test_case( "baseline widely available on 2023-04-05" ; "widely on date 2023-04-05" ) ]
198+ #[ test_case( "baseline widely available on 2024-06-15" ; "widely on date 2024-06-15" ) ]
199+ #[ test_case( "baseline 2022 with downstream" ; "year with downstream" ) ]
200+ #[ test_case( "baseline widely available with downstream" ; "widely with downstream" ) ]
201+ #[ test_case( "baseline 2020 with downstream including kaios" ; "year with downstream and kaios" ) ]
202+ fn valid ( query : & str ) {
203+ run_compare ( query, & Opts :: default ( ) , None ) ;
346204 }
347205}
0 commit comments