novelty.rs
2.2 kB · rust · 58 lines
1use mrlydemo::novelty::Novelty;23#[test]4fn the_meter_reads_the_grid_and_the_zeros() {5 let meter = Novelty::new(16.0, 16, 10).unwrap();6 let heights = meter.heights();7 assert_eq!(heights.len(), 129);8 assert_eq!((heights[0], heights[128]), (8.0, 16.0));9 assert_eq!(meter.sieve(), 131_072);10 assert_eq!(meter.dots(false).len(), 129);11 assert_eq!(meter.dots(true).len(), 129);12 let gammas = meter.gammas();13 assert_eq!(gammas.len(), 10);14 assert!((gammas[0] - 14.134_725).abs() < 1e-6);15 assert!((gammas[9] - 49.773_832).abs() < 1e-5);16 let amplitudes = meter.amplitudes();17 assert!((amplitudes[0] - 0.1879).abs() < 5e-4);18 assert!((amplitudes[9] - 4.286e-3).abs() < 5e-6);19}2021#[test]22fn the_wave_of_the_first_zeros_closes_on_the_dots() {23 let meter = Novelty::new(16.0, 16, 10).unwrap();24 assert_eq!(meter.miss(0).unwrap(), 1.0);25 let one = meter.miss(1).unwrap();26 let ten = meter.miss(10).unwrap();27 assert!(one > 0.3 && one < 0.7, "{one}");28 assert!(ten < 5e-2, "{ten}");29 assert_eq!(meter.wave(0, false, &[8.0, 12.0]).unwrap(), vec![0.0, 0.0]);30 let smooth = meter.wave(1, false, &[10.0]).unwrap()[0];31 let sharp = meter.wave(1, true, &[10.0]).unwrap()[0];32 assert!((sharp - smooth / 32.0).abs() < 1e-12);33 let rough = meter.dots(true);34 assert!(rough.iter().all(|v| v.abs() < 2.0));35 assert!(rough.iter().any(|v| v.abs() > 0.1));36}3738#[test]39fn the_full_meter_is_the_first_thirty_zeros() {40 let meter = Novelty::new(20.0, 16, 30).unwrap();41 assert_eq!(meter.heights().len(), 193);42 assert_eq!(meter.sieve(), 2_097_152);43 assert!(meter.miss(30).unwrap() < 1e-2);44 let peak = meter.dots(false).iter().fold(0.0f64, |a, v| a.max(v.abs()));45 assert!(peak > 0.3 && peak < 0.6, "{peak}");46}4748#[test]49fn the_meter_refuses_what_it_cannot_hold() {50 assert!(Novelty::new(8.0, 16, 1).is_err());51 assert!(Novelty::new(22.0, 16, 1).is_err());52 assert!(Novelty::new(12.0, 0, 1).is_err());53 assert!(Novelty::new(12.0, 33, 1).is_err());54 assert!(Novelty::new(12.0, 16, 139).is_err());55 let meter = Novelty::new(12.0, 8, 3).unwrap();56 assert!(meter.wave(4, false, &[9.0]).is_err());57 assert!(meter.miss(4).is_err());58}