@@ -11,7 +11,7 @@ import Data.Date as Date
1111import Data.DateTime as DateTime
1212import Data.DateTime (DateTime(..), Date(..), Time(..))
1313import Data.Enum (toEnum)
14−import Data.Maybe (Maybe(..))
14+import Data.Maybe (Maybe(..), isNothing)
1515import Data.Time.Duration (Milliseconds(..))
1616import Test.Spec (describe, it)
1717import Test.Spec.Assertions (shouldEqual, fail)
@@ -115,17 +115,17 @@ main = runMocha do
115115 describe "IDBKeyRange" do
116116 it "only(int)" do
117117 let key = 14
118− range = IDBKeyRange.new $ IDBKeyRange.Only key
118+ range = IDBKeyRange.only key
119119 IDBKeyRange.includes range (toKey key) `shouldEqual` true
120120
121121 it "only(string)" do
122122 let key = "patate"
123− range = IDBKeyRange.new $ IDBKeyRange.Only key
123+ range = IDBKeyRange.only key
124124 IDBKeyRange.includes range (toKey key) `shouldEqual` true
125125
126126 it "only(float)" do
127127 let key = 14.42
128− range = IDBKeyRange.new $ IDBKeyRange.Only key
128+ range = IDBKeyRange.only key
129129 IDBKeyRange.includes range (toKey key) `shouldEqual` true
130130
131131 it "only(date)" do
@@ -137,19 +137,135 @@ main = runMocha do
137137 Nothing ->
138138 fail "unable to create datetime"
139139 Just key -> do
140− let range = IDBKeyRange.new $ IDBKeyRange.Only key
140+ let range = IDBKeyRange.only key
141141 IDBKeyRange.includes range (toKey key) `shouldEqual` true
142142
143143 it "only([int])" do
144144 let key = [14, 42]
145− range = IDBKeyRange.new $ IDBKeyRange.Only key
145+ range = IDBKeyRange.only key
146146 IDBKeyRange.includes range (toKey key) `shouldEqual` true
147147
148148 it "only([string])" do
149149 let key = ["patate", "autruche"]
150− range = IDBKeyRange.new $ IDBKeyRange.Only key
150+ range = IDBKeyRange.only key
151151 IDBKeyRange.includes range (toKey key) `shouldEqual` true
152152
153+ it "lowerBound(14, open)" do
154+ let key = 14
155+ open = true
156+ range = IDBKeyRange.lowerBound key open
157+ IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` true
158+ IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
159+ IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` false
160+
161+ it "lowerBound(14, close)" do
162+ let key = 14
163+ open = false
164+ range = IDBKeyRange.lowerBound key open
165+ IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` true
166+ IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
167+ IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` false
168+
169+ it "upperBound(14, open)" do
170+ let key = 14
171+ open = true
172+ range = IDBKeyRange.upperBound key open
173+ IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` false
174+ IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
175+ IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` true
176+
177+ it "upperBound(14, close)" do
178+ let key = 14
179+ open = false
180+ range = IDBKeyRange.upperBound key open
181+ IDBKeyRange.includes range (toKey (key + 1)) `shouldEqual` false
182+ IDBKeyRange.includes range (toKey key) `shouldEqual` (not open)
183+ IDBKeyRange.includes range (toKey (key - 1)) `shouldEqual` true
184+
185+ it "bound(42, 14, open, open) => Nothing" do
186+ let lower = 42
187+ upper = 14
188+ lowerOpen = true
189+ upperOpen = true
190+ mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
191+ isNothing mrange `shouldEqual` true
192+
193+ it "bound(14, 42, open, open)" do
194+ let lower = 14
195+ upper = 42
196+ lowerOpen = true
197+ upperOpen = true
198+ mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
199+ case mrange of
200+ Nothing ->
201+ fail "invalid range provided"
202+ Just range -> do
203+ IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
204+ IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
205+ IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
206+ IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
207+ IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
208+ IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
209+
210+ it "bound(14, 42, open, close)" do
211+ let lower = 14
212+ upper = 42
213+ lowerOpen = true
214+ upperOpen = false
215+ mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
216+ case mrange of
217+ Nothing ->
218+ fail "invalid range provided"
219+ Just range -> do
220+ IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
221+ IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
222+ IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
223+ IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
224+ IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
225+ IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
226+
227+ it "bound(14, 42, close, open)" do
228+ let lower = 14
229+ upper = 42
230+ lowerOpen = false
231+ upperOpen = true
232+ mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
233+ case mrange of
234+ Nothing ->
235+ fail "invalid range provided"
236+ Just range -> do
237+ IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
238+ IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
239+ IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
240+ IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
241+ IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
242+ IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
243+
244+ it "bound(14, 42, close, close)" do
245+ let lower = 14
246+ upper = 42
247+ lowerOpen = false
248+ upperOpen = false
249+ mrange = IDBKeyRange.bound { lower, upper, lowerOpen, upperOpen }
250+ case mrange of
251+ Nothing ->
252+ fail "invalid range provided"
253+ Just range -> do
254+ IDBKeyRange.includes range (toKey (lower + 1)) `shouldEqual` true
255+ IDBKeyRange.includes range (toKey (upper - 1)) `shouldEqual` true
256+ IDBKeyRange.includes range (toKey (lower - 1)) `shouldEqual` false
257+ IDBKeyRange.includes range (toKey (upper + 1)) `shouldEqual` false
258+ IDBKeyRange.includes range (toKey lower) `shouldEqual` (not lowerOpen)
259+ IDBKeyRange.includes range (toKey upper) `shouldEqual` (not upperOpen)
260+
261+ it "can access attributes of a range" do
262+ let range = IDBKeyRange.lowerBound 14 true
263+ IDBKeyRange.lower range `shouldEqual` (Just $ toKey 14)
264+ IDBKeyRange.upper range `shouldEqual` (Nothing :: Maybe Key)
265+ IDBKeyRange.lowerOpen range `shouldEqual` true
266+ -- NOTE Not true on Chrome 56.x => The default value for the flag is `true`
267+ -- IDBKeyRange.upperOpen range `shouldEqual` false
268+
153269 describe "IDBDatabase" do
154270 it "createObjectStore (keyPath: [], autoIncrement: true)" do
155271 let dbName = "db-create-store-01"
@@ -393,7 +509,7 @@ main = runMocha do
393509 _ <- launchAff $ do
394510 _ <- IDBObjectStore.add store "patate" (Just $ toKey 14)
395511 _ <- IDBObjectStore.clear store
396− v <- IDBObjectStore.get store (IDBKeyRange.new $ IDBKeyRange.Only 14)
512+ v <- IDBObjectStore.get store (IDBKeyRange.only 14)
397513 v `shouldEqual` (Nothing :: Maybe Int)
398514
399515 pure unit