module QCInterval (qcIntervalTests) where import Test.QuickCheck.Batch import Test.QuickCheck import Music.Diatonic import QCNote instance Arbitrary Interval where arbitrary = do i <- elements [Unison, Min2nd, Maj2nd, Min3rd, Maj3rd, Perf4th, Perf5th, Min6th, Maj6th, Min7th, Maj7th, min9th, maj9th, perf11th, min13th, maj13th] a <- elements [diminish.diminish, diminish, id, augment, augment.augment] return (a i) coarbitrary = error "Not implemented" prop_interval_up_down i = (augment . diminish $ i) == i prop_interval_down_up i = (diminish . augment $ i) == i prop_interval_up_semis i = (semitones . augment $ i) == ((semitones i) + 1) prop_interval_down_semis i = (semitones . diminish $ i) == ((semitones i) - 1) prop_interval_up_steps i = (steps . augment $ i) == steps i prop_interval_down_steps i = (steps . diminish $ i) == steps i prop_interval_above_below i n = (i `below` (i `above` n)) == n prop_interval_distance_above n1 n2 = (n1 `distance` n2) `above` n1 == n2 prop_interval_distance_below n1 n2 = (n1 `distance` n2) `below` n2 == n1 options = TestOptions { no_of_tests = 100, length_of_tests = 0, debug_tests = False } qcIntervalTests = do runTests "Music.Diatonic.Interval" options [ run prop_interval_up_down , run prop_interval_down_up , run prop_interval_up_semis , run prop_interval_down_semis , run prop_interval_up_steps , run prop_interval_down_steps , run prop_interval_above_below , run prop_interval_distance_above , run prop_interval_distance_below ]