packages feed

scalendar-1.0.0: test/Test.hs

module Main where


import Test.Hspec
import Test.QuickCheck.Property (property)
import SCalendarTest.Internal ( alwaysGreateOrEqualThanN
                              , eqIntervalsIfIncludeEachOther
                              , returnsTargetZipper
                              , isLeftMostTopNode
                              , isRightMostTopNode
                              , returnsCommonParent
                              , leftMostAndRightMostInTopMost
                              , outerMostNodesIncludeIntermediate
                              , ifOnlyOneTopNodeItEqualsInterval
                              , parentOfTopNodesNotIncluded     )
import SCalendarTest.Operations ( symmetricalIntervalLength
                                , qMaxOfParentIncludedInChildren
                                , quantityNotAvailableAfterReservation
                                , periodNotAvailableAfterReservation
                                , reservAvailableAfterCancellation   )
import SCalendarTest.Constructors (calendarSizePowerOfTwo, augmentedCalendarPowerOfKPlusN)


main :: IO ()
main =
  hspec $ do
    describe "powerOftwo :: Int -> Int" $ do
      it "always returns a power of 2 greater or equal than its argument" $ do
        property alwaysGreateOrEqualThanN
    describe "isIncluded :: isIncluded :: TimePeriod -> TimePeriod -> Bool" $ do
      it "determines if the first interval is included in the second one" $ do
        property eqIntervalsIfIncludeEachOther
    describe "createCalendar :: createCalendar :: FirstDay -> NumDays -> Maybe Calendar" $ do
      it "creates a calendar with a number of days 2^(powerOftwo NumDays)" $ do
        property calendarSizePowerOfTwo
      it "creates a calendar with symmetric intervals" $ do
        property symmetricalIntervalLength
    describe "augmentCalendar :: SCalendar -> Int -> Maybe SCalendar" $ do
      it "always creates a calendar augmented k times the power of the original size" $ do
        property augmentedCalendarPowerOfKPlusN
    describe "goToNode :: TimePeriod -> Calendar -> Maybe CalendarZipper" $ do
      it "goes to the node with interval (From, To) in the calendar" $ do
        property returnsTargetZipper
    describe "leftMostTopNode :: TimePeriod -> Calendar -> Maybe CalendarZipper" $ do
      it "returns a Zipper with a valid left-most interval" $ do
        property isLeftMostTopNode
    describe "rightMostTopNode :: TimePeriod -> Calendar -> Maybe CalendarZipper" $ do
      it "returns a Zipper with a valid right-most interval" $ do
        property isRightMostTopNode
    describe "commonParent :: CalendarZipper -> CalendarZipper -> Maybe CalendarZipper" $ do
      it "returns a Zipper which is a common parent node of its arguments" $ do
        property returnsCommonParent
    describe "topMostNodes :: TimePeriod -> Calendar -> Maybe [CalendarZipper]" $ do
      it "returns a list of topmost-nodes *including* the rightmost and the leftmost ones" $ do
        property leftMostAndRightMostInTopMost
      it "returns a list of topmost-nodes *included* in the rightmost and the leftmost ones" $ do
        property outerMostNodesIncludeIntermediate
      it "returns a list of topmost-nodes with no parent included in (From, To)" $ do
        property parentOfTopNodesNotIncluded
      context "when there is only one topmost-node" $ do
        it "must return an interval equal to (From, To)" $ do
          property ifOnlyOneTopNodeItEqualsInterval
    describe "reserveManyPeriods :: [Reservation] -> SCalendar -> Maybe SCalendar" $ do
      it "returns a Calendar which satisfies that QMax of parent node is included in QMax of left child" $ do
        property qMaxOfParentIncludedInChildren
    describe "isQuantityAvailable :: Quantity -> TimePeriod -> SCalendar -> Bool" $ do
      it "determines if a quantity is available after a reservation" $ do
        property quantityNotAvailableAfterReservation
    describe "isReservAvailable :: Reservation -> SCalendar -> Bool" $ do
      context "when a node has already been reserved" $ do
        it "returns false for the same reservation in that node" $ do
          property periodNotAvailableAfterReservation
    describe "cancelManyPeriods :: [Cancellation] -> Calendar -> Maybe Calendar" $ do
      context "when a reservation in a node is cancelled" $ do
        it "becomes again availabale" $ do
          property reservAvailableAfterCancellation