@@ -39,143 +39,198 @@ mod tests {
3939 use crate :: arbitrary:: { any, * } ;
4040 use crate :: trig:: { cossubatan, tanaddatan} ;
4141 use approx:: { assert_ulps_eq, ulps_eq} ;
42- use proptest:: prelude :: * ;
42+ use proptest:: prop_assume ;
4343 use std:: f64:: consts:: { FRAC_PI_2 , SQRT_2 } ;
44+ use test_strategy:: proptest;
4445
45- proptest ! {
46- #[ test]
47- fn is_commutative( a in not_nan( ) , b in not_nan( ) , c in not_nan( ) , d in not_nan( ) ) {
48- let p = Phasor { mag: a, tan: b } ;
49- let q = Phasor { mag: c, tan: d } ;
46+ #[ proptest]
47+ fn is_commutative (
48+ #[ strategy( not_nan( ) ) ] a : f64 ,
49+ #[ strategy( not_nan( ) ) ] b : f64 ,
50+ #[ strategy( not_nan( ) ) ] c : f64 ,
51+ #[ strategy( not_nan( ) ) ] d : f64 ,
52+ ) {
53+ let p = Phasor { mag : a, tan : b } ;
54+ let q = Phasor { mag : c, tan : d } ;
5055
51- prop_assume!( !p. is_infinite( ) || !q. is_infinite( ) || !ulps_eq!( p, -q) ) ;
56+ prop_assume ! ( !p. is_infinite( ) || !q. is_infinite( ) || !ulps_eq!( p, -q) ) ;
5257
53- assert_ulps_eq!( p + q, q + p) ;
54- }
55-
56- #[ test]
57- fn equals_sum_of_real_and_imaginary_parts( a in normal( ) , b in not_nan( ) , c in normal( ) , d in not_nan( ) ) {
58- let p = Phasor { mag: a, tan: b } ;
59- let q = Phasor { mag: c, tan: d } ;
60- let r = Phasor :: rect( p. real( ) + q. real( ) , p. imag( ) + q. imag( ) ) ;
61-
62- assert_ulps_eq!( p + q, r, max_ulps = 800 ) ;
63- assert_ulps_eq!( q + p, r, max_ulps = 800 ) ;
64- }
65-
66- #[ test]
67- fn has_zero_as_identity( a in nonzero( ) , b in not_nan( ) , c in zero( ) , d in not_nan( ) ) {
68- let p = Phasor { mag: a, tan: b } ;
69- let q = Phasor { mag: c, tan: d } ;
70-
71- assert_ulps_eq!( p + q, p) ;
72- assert_ulps_eq!( q + p, p) ;
73- }
74-
75- #[ test]
76- fn has_infinity_as_identity( a in finite( ) , b in not_nan( ) , c in infinite( ) , d in not_nan( ) ) {
77- let p = Phasor { mag: a, tan: b } ;
78- let q = Phasor { mag: c, tan: d } ;
79-
80- assert_ulps_eq!( p + q, q) ;
81- assert_ulps_eq!( q + p, q) ;
82- }
83-
84- #[ test]
85- fn has_bisector_angle_if_magnitudes_are_equal( mag in not_nan( ) , t in not_nan( ) , u in not_nan( ) ) {
86- prop_assume!( cossubatan( t, u) > -0.9f64 ) ;
58+ assert_ulps_eq ! ( p + q, q + p) ;
59+ }
8760
88- let p = Phasor { mag, tan: t } ;
89- let q = Phasor { mag, tan: u } ;
61+ #[ proptest]
62+ fn equals_sum_of_real_and_imaginary_parts (
63+ #[ strategy( normal( ) ) ] a : f64 ,
64+ #[ strategy( not_nan( ) ) ] b : f64 ,
65+ #[ strategy( normal( ) ) ] c : f64 ,
66+ #[ strategy( not_nan( ) ) ] d : f64 ,
67+ ) {
68+ let p = Phasor { mag : a, tan : b } ;
69+ let q = Phasor { mag : c, tan : d } ;
70+ let r = Phasor :: rect ( p. real ( ) + q. real ( ) , p. imag ( ) + q. imag ( ) ) ;
71+
72+ assert_ulps_eq ! ( p + q, r, max_ulps = 800 ) ;
73+ assert_ulps_eq ! ( q + p, r, max_ulps = 800 ) ;
74+ }
9075
91- let ( s, c) = tanaddatan( t, u) ;
76+ #[ proptest]
77+ fn has_zero_as_identity (
78+ #[ strategy( nonzero( ) ) ] a : f64 ,
79+ #[ strategy( not_nan( ) ) ] b : f64 ,
80+ #[ strategy( zero( ) ) ] c : f64 ,
81+ #[ strategy( not_nan( ) ) ] d : f64 ,
82+ ) {
83+ let p = Phasor { mag : a, tan : b } ;
84+ let q = Phasor { mag : c, tan : d } ;
85+
86+ assert_ulps_eq ! ( p + q, p) ;
87+ assert_ulps_eq ! ( q + p, p) ;
88+ }
9289
93- let r = Phasor :: polar(
94- mag * ( 1f64 + cossubatan( t, u) ) . sqrt( ) * SQRT_2 ,
95- s. atan2( c) / 2f64 ,
96- ) ;
90+ #[ proptest]
91+ fn has_infinity_as_identity (
92+ #[ strategy( finite( ) ) ] a : f64 ,
93+ #[ strategy( not_nan( ) ) ] b : f64 ,
94+ #[ strategy( infinite( ) ) ] c : f64 ,
95+ #[ strategy( not_nan( ) ) ] d : f64 ,
96+ ) {
97+ let p = Phasor { mag : a, tan : b } ;
98+ let q = Phasor { mag : c, tan : d } ;
99+
100+ assert_ulps_eq ! ( p + q, q) ;
101+ assert_ulps_eq ! ( q + p, q) ;
102+ }
97103
98- assert_ulps_eq!( p + q, r, max_ulps = 80 ) ;
99- assert_ulps_eq!( q + p, r, max_ulps = 80 ) ;
100- }
104+ #[ proptest]
105+ fn has_bisector_angle_if_magnitudes_are_equal (
106+ #[ strategy( not_nan( ) ) ] mag : f64 ,
107+ #[ strategy( not_nan( ) ) ] t : f64 ,
108+ #[ strategy( not_nan( ) ) ] u : f64 ,
109+ ) {
110+ prop_assume ! ( cossubatan( t, u) > -0.9f64 ) ;
101111
102- #[ test]
103- fn has_bisector_angle_if_magnitudes_are_opposite( mag in not_nan( ) , t in not_nan( ) , u in not_nan( ) ) {
104- prop_assume!( cossubatan( t, u) < 0.9f64 ) ;
112+ let p = Phasor { mag, tan : t } ;
113+ let q = Phasor { mag, tan : u } ;
105114
106- let p = Phasor { mag, tan: t } ;
107- let q = Phasor { mag: -mag, tan: u } ;
115+ let ( s, c) = tanaddatan ( t, u) ;
108116
109- let ( s, c) = tanaddatan( t, u) ;
117+ let r = Phasor :: polar (
118+ mag * ( 1f64 + cossubatan ( t, u) ) . sqrt ( ) * SQRT_2 ,
119+ s. atan2 ( c) / 2f64 ,
120+ ) ;
110121
111- let r = Phasor :: polar(
112- mag * ( 1f64 - cossubatan( t, u) ) . sqrt( ) * SQRT_2 ,
113- s. atan2( c) / 2f64 + if t < u { -FRAC_PI_2 } else { FRAC_PI_2 } ,
114- ) ;
122+ assert_ulps_eq ! ( p + q, r, max_ulps = 80 ) ;
123+ assert_ulps_eq ! ( q + p, r, max_ulps = 80 ) ;
124+ }
115125
116- assert_ulps_eq!( p + q, r, max_ulps = 80 ) ;
117- assert_ulps_eq!( q + p, r, max_ulps = 80 ) ;
118- }
126+ #[ proptest]
127+ fn has_bisector_angle_if_magnitudes_are_opposite (
128+ #[ strategy( not_nan( ) ) ] mag : f64 ,
129+ #[ strategy( not_nan( ) ) ] t : f64 ,
130+ #[ strategy( not_nan( ) ) ] u : f64 ,
131+ ) {
132+ prop_assume ! ( cossubatan( t, u) < 0.9f64 ) ;
119133
120- #[ test]
121- fn is_real_if_phasors_are_conjugate( mag in not_nan( ) , tan in not_nan( ) ) {
122- let p = Phasor { mag, tan } ;
123- let q = p. conj( ) ;
134+ let p = Phasor { mag, tan : t } ;
135+ let q = Phasor { mag : -mag, tan : u } ;
124136
125- let r = Phasor {
126- mag: p. real( ) + q. real( ) ,
127- tan: 0f64
128- } ;
137+ let ( s, c) = tanaddatan ( t, u) ;
129138
130- prop_assume!( !p. is_infinite( ) || !p. is_imaginary( ) ) ;
139+ let r = Phasor :: polar (
140+ mag * ( 1f64 - cossubatan ( t, u) ) . sqrt ( ) * SQRT_2 ,
141+ s. atan2 ( c) / 2f64 + if t < u { -FRAC_PI_2 } else { FRAC_PI_2 } ,
142+ ) ;
131143
132- assert_ulps_eq!( p + q, r, max_ulps = 40 ) ;
133- assert_ulps_eq!( q + p, r, max_ulps = 40 ) ;
134- }
144+ assert_ulps_eq ! ( p + q, r, max_ulps = 80 ) ;
145+ assert_ulps_eq ! ( q + p, r, max_ulps = 80 ) ;
146+ }
135147
136- #[ test]
137- fn has_double_magnitude_if_phasors_are_equal( mag in not_nan( ) , tan in not_nan( ) ) {
138- let p = Phasor { mag, tan } ;
139- let r = Phasor { mag: 2f64 * mag, tan } ;
148+ #[ proptest]
149+ fn is_real_if_phasors_are_conjugate (
150+ #[ strategy( not_nan( ) ) ] mag : f64 ,
151+ #[ strategy( not_nan( ) ) ] tan : f64 ,
152+ ) {
153+ let p = Phasor { mag, tan } ;
154+ let q = p. conj ( ) ;
140155
141- assert_ulps_eq!( p + p, r) ;
142- }
156+ let r = Phasor {
157+ mag : p. real ( ) + q. real ( ) ,
158+ tan : 0f64 ,
159+ } ;
143160
144- #[ test]
145- fn is_zero_if_phasors_are_finite_and_opposite( mag in finite( ) , tan in not_nan( ) ) {
146- let p = Phasor { mag, tan } ;
147- let q = -p;
148- let r = Phasor { mag: 0f64 , tan: -tan. recip( ) } ;
161+ prop_assume ! ( !p. is_infinite( ) || !p. is_imaginary( ) ) ;
149162
150- assert_ulps_eq!( p + q, r) ;
151- assert_ulps_eq!( q + p, r) ;
152- }
163+ assert_ulps_eq ! ( p + q, r, max_ulps = 40 ) ;
164+ assert_ulps_eq ! ( q + p, r, max_ulps = 40 ) ;
165+ }
153166
154- #[ test]
155- fn is_nan_if_phasors_are_opposite_and_infinite( mag in infinite( ) , tan in not_nan( ) ) {
156- let p = Phasor { mag, tan } ;
157- let q = -p;
167+ #[ proptest]
168+ fn has_double_magnitude_if_phasors_are_equal (
169+ #[ strategy( not_nan( ) ) ] mag : f64 ,
170+ #[ strategy( not_nan( ) ) ] tan : f64 ,
171+ ) {
172+ let p = Phasor { mag, tan } ;
173+ let r = Phasor {
174+ mag : 2f64 * mag,
175+ tan,
176+ } ;
177+
178+ assert_ulps_eq ! ( p + p, r) ;
179+ }
158180
159- assert!( ( p + q) . is_nan( ) ) ;
160- assert!( ( q + p) . is_nan( ) ) ;
161- }
181+ #[ proptest]
182+ fn is_zero_if_phasors_are_finite_and_opposite (
183+ #[ strategy( finite( ) ) ] mag : f64 ,
184+ #[ strategy( not_nan( ) ) ] tan : f64 ,
185+ ) {
186+ let p = Phasor { mag, tan } ;
187+ let q = -p;
188+ let r = Phasor {
189+ mag : 0f64 ,
190+ tan : -tan. recip ( ) ,
191+ } ;
192+
193+ assert_ulps_eq ! ( p + q, r) ;
194+ assert_ulps_eq ! ( q + p, r) ;
195+ }
162196
163- #[ test]
164- fn is_nan_if_magnitude_is_nan( a in any( ) , b in any( ) , c in nan( ) , d in any( ) ) {
165- let p = Phasor { mag: a, tan: b } ;
166- let q = Phasor { mag: c, tan: d } ;
197+ #[ proptest]
198+ fn is_nan_if_phasors_are_opposite_and_infinite (
199+ #[ strategy( infinite( ) ) ] mag : f64 ,
200+ #[ strategy( not_nan( ) ) ] tan : f64 ,
201+ ) {
202+ let p = Phasor { mag, tan } ;
203+ let q = -p;
167204
168- assert!( ( p + q) . is_nan( ) ) ;
169- assert!( ( q + p) . is_nan( ) ) ;
170- }
205+ assert ! ( ( p + q) . is_nan( ) ) ;
206+ assert ! ( ( q + p) . is_nan( ) ) ;
207+ }
171208
172- #[ test]
173- fn is_nan_if_tangent_is_nan( a in any( ) , b in any( ) , c in any( ) , d in nan( ) ) {
174- let p = Phasor { mag: a, tan: b } ;
175- let q = Phasor { mag: c, tan: d } ;
209+ #[ proptest]
210+ fn is_nan_if_magnitude_is_nan (
211+ #[ strategy( any( ) ) ] a : f64 ,
212+ #[ strategy( any( ) ) ] b : f64 ,
213+ #[ strategy( nan( ) ) ] c : f64 ,
214+ #[ strategy( any( ) ) ] d : f64 ,
215+ ) {
216+ let p = Phasor { mag : a, tan : b } ;
217+ let q = Phasor { mag : c, tan : d } ;
218+
219+ assert ! ( ( p + q) . is_nan( ) ) ;
220+ assert ! ( ( q + p) . is_nan( ) ) ;
221+ }
176222
177- assert!( ( p + q) . is_nan( ) ) ;
178- assert!( ( q + p) . is_nan( ) ) ;
179- }
223+ #[ proptest]
224+ fn is_nan_if_tangent_is_nan (
225+ #[ strategy( any( ) ) ] a : f64 ,
226+ #[ strategy( any( ) ) ] b : f64 ,
227+ #[ strategy( any( ) ) ] c : f64 ,
228+ #[ strategy( nan( ) ) ] d : f64 ,
229+ ) {
230+ let p = Phasor { mag : a, tan : b } ;
231+ let q = Phasor { mag : c, tan : d } ;
232+
233+ assert ! ( ( p + q) . is_nan( ) ) ;
234+ assert ! ( ( q + p) . is_nan( ) ) ;
180235 }
181236}
0 commit comments