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}