packages feed

fadno-1.1.7: tests/MeterSpec.hs

module MeterSpec where

import Test.HUnit
import Fadno.Meter
import Data.Ratio
import Fadno.Note
import Fadno.Notation
import Control.Lens
import GHC.Real

_i :: Int -> Int
_i = id
_n = map (map (_i 1|:))


tests :: Test
tests = "meter" ~: [
         "rebar" ~: [
          rebars' (TimeSignature 4 Q4)
          [[[_i 1]|:2%8,rest $ 3%8,[1,2]|:11%8] ,
           [[4,5]|:4%8,rest $ 5%8],
           [[3]|:3%8]]
          @?=
          [bar [note' ([1]|:2%8),rest (3%8),note' ([1,2]|:3%8) & tie ?~ TStart]
                   & timeSignature ?~ 4/:Q4 ,
           bar [note' ([1,2]|:8%8) & tie ?~ TStop] ,
           bar [note' ([4,5]|:4%8), rest (4%8)] ,
           bar [rest (1%8),note' ([3]|:3%8)] & timeSignature ?~ 2/:Q4],
          rebars' (TimeSignature 4 Q4)
          [[[_i 1]|:2%8,rest $ 3%8,[1,2]|:11%8],
           [[4,5]|:4%8,rest $ 5%8],
           [[3]|:1%8]]
          @?=
          [bar [note' ([1]|:2%8),rest $ 3%8,note' ([1,2]|:3%8) & tie ?~ TStart]
                   & timeSignature ?~ 4/:Q4,
           bar [note' ([1,2]|:8%8) & tie ?~ TStop],
           bar [note' ([4,5]|:4%8), note' ([]|:1 % 2),note' ([]|:1 % 8),note' ([3]|:1 % 8)]
                   & timeSignature ?~ 5/:Q4],
          rebar' (TimeSignature 5 Q4)
          [([_i 40]|:2%8),([41]|:2%8),([42]|:1%8),
           ([41]|:5%8),([42]|:3%8),([41]|:2%8)]
          @?=
          [bar [note' ([40]|:2%8),note' ([41]|:2%8),note' ([42]|:1%8),
                   note' ([41]|:5%8)] & timeSignature ?~ (5/:Q4),
           bar [note' ([42]|:3%8),note' ([41]|:2%8)] & timeSignature ?~ (5/:Q8)],
          rebar (TimeSignature 5 Q4)
          [([_i 40]|:2%8),([41]|:2%8),([42]|:1%8),
                           ([41]|:5%8),([42]|:3%8)] @?=
          [bar [note' ([40]|:2%8),note' ([41]|:2%8),note' ([42]|:1%8),note' ([41]|:5%8),
                note' ([42]|:3%8)] & timeSignature ?~ (13/:Q8)],
          rebar' (2/:Q4) [[_i 1]|:4%1] @?=
          [bar [note' ([1]|:1 % 2) & tie ?~ TStart] & timeSignature ?~ 2/:Q4,
           bar [note' ([1]|:1 % 2) & tie ?~ TBoth],
           bar [note' ([1]|:1 % 2) & tie ?~ TBoth],
           bar [note' ([1]|:1 % 2) & tie ?~ TBoth],
           bar [note' ([1]|:1 % 2) & tie ?~ TBoth],
           bar [note' ([1]|:1 % 2) & tie ?~ TBoth],
           bar [note' ([1]|:1 % 2) & tie ?~ TBoth],
           bar [note' ([1]|:1 % 2) & tie ?~ TStop]],
          -- Bad TS bug
          rebar (4/:Q4) [M 72|:11 % 8] @?=
          [bar [note' (M 72|:1 % 1) & tie ?~ TStart,note' (M 72|:3 % 8) & tie ?~ TStop] & timeSignature ?~ 11/:Q8],
          -- bad joinLast bug
          rebar (4/:Q4) [M 72|:9 % 8,M 72|:1%4] @?=
          [bar [note' (M 72|:1 % 1) & tie ?~ TStart,note' (M 72|:1 % 8) & tie ?~ TStop,
                note' (M 72|:1 % 4)] & timeSignature ?~ 11/:Q8]


         ],
        "validDur" ~: [
         filter ((==False).snd) (map (\d -> (d,validDur d))
                                 [2,
                                  1,3%2,7%4,
                                  1%2,3%4,7%8,
                                  1%8,3%16,
                                  1%5,2%5,3%5,7%5,
                                 1%3,2%3,4%3]) @?= [],
         filter ((==True).snd) (map (\d -> (d,validDur d))
                                [3,7%2,15%4,15%8,
                                 5%4,9%8,15%16,
                                 15%5,5%3,15%7]) @?= []
        ],
         "splitDur" ~: [
          splitDur (17%20) @?= [3 % 5,1 % 4],
          splitDur (5:%10) @?= [1 % 5,3 % 10],
          splitDur 4 @?= [2,2],
          splitDur (5%8) @?= [1 % 4,3 % 8]
         ],
         "tieRules" ~: [
          -- test normal split
          tieRules' [mono' (_i 1) $ 5%8,rest $ 5%8] @?=
          bar [mono 1 (1%4) & tie ?~ TStart,
               mono 1 (3%8) & tie ?~ TStop,
               rest (1%4),
               rest (3%8)],
          -- test split with pre-existing tie (both)
          tieRules' [note' ([_i 1]|:5%8) & tie ?~ TBoth] @?=
          bar [note' ([1]|:1%4) & tie ?~ TBoth,
               note' ([1]|:3%8) & tie ?~ TBoth],
          -- test split with pre-existing tie (start)
          tieRules' [note' ([_i 1]|:5%8) & tie ?~ TStart] @?=
          bar [note' ([1]|:1%4) & tie ?~ TStart,
               note' ([1]|:3%8) & tie ?~ TBoth],
          -- test split with pre-existing tie (end)
          tieRules' [note' ([_i 1]|:5%8) & tie ?~ TStop] @?=
          bar [note' ([1]|:1%4) & tie ?~ TBoth,
               note' ([1]|:3%8) & tie ?~ TStop],
          -- test no split, with pre-existing tie
          tieRules' [note' ([_i 1]|:1) & tie ?~ TBoth] @?= bar [note' ([_i 1]|:1) & tie ?~ TBoth],
          -- test split, one note
          tieRules' [[_i 1]|:11%8] @?=
          bar [note' ([1]|:2:%4) & tie ?~ TStart,
               note' ([1]|:7%8) & tie ?~ TStop]
         ],
         "selectTimeSig" ~: [
          selectTimeSig (_n [[3%4,2%4,3%8,2%8],[3%4,2%4]])
                            @?= Just (5/:Q4),
          selectTimeSig (_n [[1%4,1%4,1%4,1%4],[2%4,2%4,1%4,1%4,2%4]])
                            @?= Just (4/:Q4),
          selectTimeSig (_n [[3%8,3%8,3%8,3%8],[1%8,1%4,3%8,3%4],[3%8,3%8]])
                            @?= Just (6/:Q8)
         ]
        ]