@@ -25,7 +25,7 @@ def setUp(self):
2525 self .test_seed = 0xDEADBEEF
2626 self .test_sample_rate = 48000
2727 self .test_duration = 1.0
28- self .test_freq = 1000.0
28+ self .test_freq = - 1000.0
2929
3030 def test_deterministic_tone_generation (self ):
3131 """test deterministic tone generation with specified parameters"""
@@ -38,7 +38,7 @@ def test_deterministic_tone_generation(self):
3838 # verify metadata
3939 self .assertEqual (signal .sample_rate , self .test_sample_rate )
4040 self .assertEqual (signal .get_global_info ()[SigMFFile .DATATYPE_KEY ], "cf32_le" )
41- self .assertIn ("1000.0 hz tone" , signal .get_global_info ()[SigMFFile .DESCRIPTION_KEY ])
41+ self .assertIn ("- 1000.0 hz tone" , signal .get_global_info ()[SigMFFile .DESCRIPTION_KEY ])
4242
4343 # verify signal characteristics
4444 samples = signal .read_samples ()
@@ -52,8 +52,8 @@ def test_deterministic_tone_generation(self):
5252 fft_samples = np .fft .fft (samples )
5353 fft_freqs = np .fft .fftfreq (len (samples ), 1 / self .test_sample_rate )
5454 dominant_freq_idx = np .argmax (np .abs (fft_samples ))
55- dominant_freq = abs ( fft_freqs [dominant_freq_idx ])
56- self .assertAlmostEqual (dominant_freq , self .test_freq , delta = 10 ) # within 10 hz
55+ dominant_freq = fft_freqs [dominant_freq_idx ]
56+ self .assertAlmostEqual (dominant_freq , self .test_freq , delta = 10 ) # within 10 hz, signed
5757
5858 def test_random_tone_generation (self ):
5959 """test random tone generation"""
@@ -92,7 +92,7 @@ def test_reproducible_random_generation(self):
9292
9393 def test_sweep_generation (self ):
9494 """test linear frequency sweep generation"""
95- start_freq = 500.0
95+ start_freq = - 500.0
9696 end_freq = 2000.0
9797
9898 gen = SigMFGenerator (seed = self .test_seed )
@@ -101,7 +101,7 @@ def test_sweep_generation(self):
101101 )
102102
103103 # verify metadata
104- self .assertIn ("500.0-2000.0 hz sweep" , signal .get_global_info ()[SigMFFile .DESCRIPTION_KEY ])
104+ self .assertIn ("- 500.0-2000.0 hz sweep" , signal .get_global_info ()[SigMFFile .DESCRIPTION_KEY ])
105105
106106 # verify signal properties
107107 samples = signal .read_samples ()
@@ -187,13 +187,15 @@ def test_parameter_validation(self):
187187 """test parameter validation and error handling"""
188188 gen = SigMFGenerator ()
189189
190- # should raise error if no signal type specified
191- with self . assertRaises ( SigMFGeneratorError ):
192- gen . generate ( )
190+ # bare generate() should now work (auto-generates components)
191+ signal = gen . generate ()
192+ self . assertIsInstance ( signal , SigMFFile )
193193
194- # should raise error for tone frequency exceeding nyquist
194+ # should raise error for tone frequency exceeding nyquist (positive and negative)
195195 with self .assertRaises (SigMFGeneratorError ):
196196 gen .tone (30000 ).sample_rate (48000 ).duration (1.0 ).generate ()
197+ with self .assertRaises (SigMFGeneratorError ):
198+ gen .tone (- 30000 ).sample_rate (48000 ).duration (1.0 ).generate ()
197199
198200 # should raise error for negative duration
199201 with self .assertRaises (SigMFGeneratorError ):
@@ -207,12 +209,15 @@ def test_sweep_parameter_validation(self):
207209 """test sweep-specific parameter validation"""
208210 gen = SigMFGenerator ()
209211
210- # sweep frequencies exceeding nyquist should raise error
212+ # sweep frequencies exceeding nyquist should raise error (positive and negative)
211213 with self .assertRaises (SigMFGeneratorError ):
212214 gen .sweep (1000 , 30000 ).sample_rate (48000 ).duration (1.0 ).generate ()
213-
214215 with self .assertRaises (SigMFGeneratorError ):
215216 gen .sweep (30000 , 1000 ).sample_rate (48000 ).duration (1.0 ).generate ()
217+ with self .assertRaises (SigMFGeneratorError ):
218+ gen .sweep (1000 , - 30000 ).sample_rate (48000 ).duration (1.0 ).generate ()
219+ with self .assertRaises (SigMFGeneratorError ):
220+ gen .sweep (- 30000 , 1000 ).sample_rate (48000 ).duration (1.0 ).generate ()
216221
217222 def test_random_parameters_reasonable (self ):
218223 """test that random parameters are within reasonable ranges"""
@@ -363,31 +368,31 @@ def test_automatic_annotations(self):
363368 self .assertIn ("+200.0 Hz" , offset_annotation [SigMFFile .LABEL_KEY ])
364369
365370 def test_sweep_annotations (self ):
366- """test sweep annotations have correct frequency bounds"""
371+ """test sweep annotations have correct frequency bounds including negative """
367372 gen = SigMFGenerator (seed = 42 )
368- signal = gen .sweep (500 , 2500 ).sample_rate (22050 ).duration (0.1 ).generate ()
373+ signal = gen .sweep (- 2500 , 2500 ).sample_rate (22050 ).duration (0.1 ).generate ()
369374
370375 annotations = signal .get_annotations ()
371376 self .assertEqual (len (annotations ), 1 ) # just main sweep annotation
372377
373378 sweep_annotation = annotations [0 ]
374- self .assertEqual (sweep_annotation [SigMFFile .FLO_KEY ], 500 .0 )
379+ self .assertEqual (sweep_annotation [SigMFFile .FLO_KEY ], - 2500 .0 )
375380 self .assertEqual (sweep_annotation [SigMFFile .FHI_KEY ], 2500.0 )
376- self .assertIn ("500 .0-2500.0 Hz sweep" , sweep_annotation [SigMFFile .LABEL_KEY ])
381+ self .assertIn ("-2500 .0-2500.0 Hz sweep" , sweep_annotation [SigMFFile .LABEL_KEY ])
377382
378383 def test_reverse_sweep_annotations (self ):
379- """test reverse sweep (high to low freq) has correct bounds"""
384+ """test reverse sweep crossing DC has correct bounds"""
380385 gen = SigMFGenerator (seed = 42 )
381- signal = gen .sweep (3000 , 800 ).sample_rate (48000 ).duration (0.1 ).generate ()
386+ signal = gen .sweep (3000 , - 800 ).sample_rate (48000 ).duration (0.1 ).generate ()
382387
383388 annotations = signal .get_annotations ()
384389 sweep_annotation = annotations [0 ]
385390
386391 # frequency bounds should be min/max regardless of sweep direction
387- self .assertEqual (sweep_annotation [SigMFFile .FLO_KEY ], 800.0 )
392+ self .assertEqual (sweep_annotation [SigMFFile .FLO_KEY ], - 800.0 )
388393 self .assertEqual (sweep_annotation [SigMFFile .FHI_KEY ], 3000.0 )
389394 # but label should show original order
390- self .assertIn ("3000.0-800.0 Hz sweep" , sweep_annotation [SigMFFile .LABEL_KEY ])
395+ self .assertIn ("3000.0-- 800.0 Hz sweep" , sweep_annotation [SigMFFile .LABEL_KEY ])
391396
392397 def test_minimal_annotations (self ):
393398 """test that simple signals get minimal but complete annotations"""
0 commit comments