1{-
2Copyright (C) 2006-2011 John Goerzen <jgoerzen@complete.org>
3
4All rights reserved.
5
6For license and copyright information, see the file LICENSE
7-}
8
9module ProgressTrackertest(tests) where
10import Data.Progress.Tracker
11import Test.HUnit
12import Control.Concurrent.MVar
13
14setup =
15    do timem <- newMVar 0
16       let timesource = readMVar timem
17       po <- newProgress' (ProgressStatus 0 100 0 "" timesource) []
18       return (po, timem)
19
20settime timem newval = swapMVar timem newval >> return ()
21
22test_incrP =
23    do (po, timem) <- setup
24       incrP po 5
25       withStatus po $ \s ->
26                  do assertEqual "completedUnits" 5 (completedUnits s)
27                     assertEqual "totalUnits" 100 (totalUnits s)
28       incrP po 95
29       withStatus po $ \s ->
30                  do assertEqual "completedUnits" 100 (completedUnits s)
31                     assertEqual "totalUnits" 100 (totalUnits s)
32       incrP po 5
33       withStatus po $ \s ->
34                  do assertEqual "completedUnits" 105 (completedUnits s)
35                     assertEqual "totalUnits" 105 (totalUnits s)
36       incrP' po 5
37       withStatus po $ \s ->
38                  do assertEqual "completedUnits" 110 (completedUnits s)
39                     assertEqual "totalUnits" 105 (totalUnits s)
40       incrTotal po 10
41       withStatus po $ \s ->
42                  do 110 @=? completedUnits s
43                     115 @=? totalUnits s
44
45test_setP =
46    do (po, timem) <- setup
47       setP po 5
48       withStatus po $ \s ->
49           do 5 @=? completedUnits s
50              100 @=? totalUnits s
51       setP po 100
52       withStatus po $ \s ->
53           do 100 @=? completedUnits s
54              100 @=? totalUnits s
55       setP po 105
56       withStatus po $ \s ->
57           do 105 @=? completedUnits s
58              105 @=? totalUnits s
59       setP' po 110
60       withStatus po $ \s ->
61           do 110 @=? completedUnits s
62              105 @=? totalUnits s
63       setTotal po 115
64       withStatus po $ \s ->
65           do 110 @=? completedUnits s
66              115 @=? totalUnits s
67
68test_speed =
69    do (po, timem) <- setup
70       getSpeed po >>= assertEqual "initial speed" 0
71       getETR po >>= assertEqual "initial ETR" 0
72       getETA po >>= assertEqual "initial ETA" 0
73
74       incrP po 10
75       getSpeed po >>= assertEqual "speed after incr" 0
76       getETR po >>= assertEqual "ETR after incr" 0
77       getETA po >>= assertEqual "ETA after incr" 0
78
79       settime timem 5
80       getSpeed po >>= assertEqual "first speed" 2.0
81       getETR po >>= assertEqual "first ETR" 45
82       getETA po >>= assertEqual "first ETA" 50
83
84       incrP po 90
85       getSpeed po >>= assertEqual "speed 2" 20.0
86       getETR po >>= assertEqual "etr 2" 0
87       getETA po >>= assertEqual "eta 2" 5
88
89       settime timem 400
90       setP po 90
91       getSpeed po >>= assertEqual "speed 3" 0.225
92       getETR po >>= assertEqual "etr 2" 44
93       getETA po >>= assertEqual "eta 2" 444
94
95test_callback =
96    do (po, _) <- setup
97       mcounter <- newMVar (0::Int)
98       mcounter1 <- newMVar (0::Int)
99       mcounter2 <- newMVar (0::Int)
100       (po2, _) <- setup
101       (po3, _) <- setup
102
103       addCallback po (minc mcounter)
104       addParent po po2
105       incrP po 5
106       readMVar mcounter >>= assertEqual "cb1" 1
107       withStatus po (\x -> 5 @=? completedUnits x)
108       withStatus po2 (\x -> do 5 @=? completedUnits x
109                                200 @=? totalUnits x)
110
111       addCallback po2 (minc mcounter2)
112       incrP po 100
113       readMVar mcounter2 >>= (\x -> assertBool "cb2" (0 /= x))
114       withStatus po2 (\x -> do 105 @=? completedUnits x
115                                205 @=? totalUnits x)
116
117       incrP' po 5
118       withStatus po2 (\x -> do 110 @=? completedUnits x
119                                205 @=? totalUnits x)
120
121       finishP po
122       withStatus po2 (\x -> do 110 @=? completedUnits x
123                                210 @=? totalUnits x)
124
125
126    where minc mv _ _ = modifyMVar_ mv (\x -> return $ x + 1)
127
128tests = TestList [TestLabel "incrP" (TestCase test_incrP),
129                  TestLabel "setP" (TestCase test_setP),
130                  TestLabel "speed" (TestCase test_speed),
131                  TestLabel "test_callback" (TestCase test_callback)]
132
133
134
135