mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 21:16:44 +00:00 
			
		
		
		
	 8edaa6e5c8
			
		
	
	
		8edaa6e5c8
		
	
	
	
	
		
			
			Currently we run logspace tests for extensive tests, but there isn't any reason we couldn't also run more kinds of tests more extensively (e.g. more edge cases, combine edge cases with logspace for multi-input functions, etc). As a first step toward making this possible, make `extensive` a new field in `CheckCtx`, and rename `QuickSpaced` to `Spaced`.
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! Test with "infinite precision"
 | |
| 
 | |
| #![cfg(feature = "build-mpfr")]
 | |
| 
 | |
| use libm_test::generate::{case_list, edge_cases, random, spaced};
 | |
| use libm_test::mpfloat::MpOp;
 | |
| use libm_test::{CheckBasis, CheckCtx, CheckOutput, GeneratorKind, MathOp, TupleCall};
 | |
| 
 | |
| const BASIS: CheckBasis = CheckBasis::Mpfr;
 | |
| 
 | |
| fn mp_runner<Op: MathOp + MpOp>(ctx: &CheckCtx, cases: impl Iterator<Item = Op::RustArgs>) {
 | |
|     let mut mp_vals = Op::new_mp();
 | |
|     for input in cases {
 | |
|         let mp_res = Op::run(&mut mp_vals, input);
 | |
|         let crate_res = input.call_intercept_panics(Op::ROUTINE);
 | |
| 
 | |
|         crate_res.validate(mp_res, input, ctx).unwrap();
 | |
|     }
 | |
| }
 | |
| 
 | |
| macro_rules! mp_tests {
 | |
|     (
 | |
|         fn_name: $fn_name:ident,
 | |
|         attrs: [$($attr:meta),*],
 | |
|     ) => {
 | |
|         paste::paste! {
 | |
|             #[test]
 | |
|             $(#[$attr])*
 | |
|             fn [< mp_case_list_ $fn_name >]() {
 | |
|                 type Op = libm_test::op::$fn_name::Routine;
 | |
|                 let ctx = CheckCtx::new(Op::IDENTIFIER, BASIS, GeneratorKind::List);
 | |
|                 let cases = case_list::get_test_cases_basis::<Op>(&ctx).0;
 | |
|                 mp_runner::<Op>(&ctx, cases);
 | |
|             }
 | |
| 
 | |
|             #[test]
 | |
|             $(#[$attr])*
 | |
|             fn [< mp_random_ $fn_name >]() {
 | |
|                 type Op = libm_test::op::$fn_name::Routine;
 | |
|                 let ctx = CheckCtx::new(Op::IDENTIFIER, BASIS, GeneratorKind::Random);
 | |
|                 let cases = random::get_test_cases::<<Op as MathOp>::RustArgs>(&ctx).0;
 | |
|                 mp_runner::<Op>(&ctx, cases);
 | |
|             }
 | |
| 
 | |
|             #[test]
 | |
|             $(#[$attr])*
 | |
|             fn [< mp_edge_case_ $fn_name >]() {
 | |
|                 type Op = libm_test::op::$fn_name::Routine;
 | |
|                 let ctx = CheckCtx::new(Op::IDENTIFIER, BASIS, GeneratorKind::EdgeCases);
 | |
|                 let cases = edge_cases::get_test_cases::<Op>(&ctx).0;
 | |
|                 mp_runner::<Op>(&ctx, cases);
 | |
|             }
 | |
| 
 | |
|             #[test]
 | |
|             $(#[$attr])*
 | |
|             fn [< mp_quickspace_ $fn_name >]() {
 | |
|                 type Op = libm_test::op::$fn_name::Routine;
 | |
|                 let ctx = CheckCtx::new(Op::IDENTIFIER, BASIS, GeneratorKind::Spaced);
 | |
|                 let cases = spaced::get_test_cases::<Op>(&ctx).0;
 | |
|                 mp_runner::<Op>(&ctx, cases);
 | |
|             }
 | |
|         }
 | |
|     };
 | |
| }
 | |
| 
 | |
| libm_macros::for_each_function! {
 | |
|     callback: mp_tests,
 | |
|     attributes: [
 | |
|         // Also an assertion failure on i686: at `MPFR_ASSERTN (! mpfr_erangeflag_p ())`
 | |
|         #[ignore = "large values are infeasible in MPFR"]
 | |
|         [jn, jnf, yn, ynf],
 | |
|     ],
 | |
|     skip: [
 | |
|         // FIXME: test needed, see
 | |
|         // https://github.com/rust-lang/libm/pull/311#discussion_r1818273392
 | |
|         nextafter,
 | |
|         nextafterf,
 | |
|     ],
 | |
| }
 |