@@ -2,10 +2,15 @@ module Test.Main where
22
33import Prelude
44
5+import Control.Monad.Except (ExceptT(..))
56import Control.Monad.Trans.Class (lift)
6−import Data.ArrayBuffer.ArrayBuffer (empty) as AB
7+import Data.ArrayBuffer.ArrayBuffer as AB
8+import Data.ArrayBuffer.Cast (fromUint8Array, toUint8Array)
79import Data.ArrayBuffer.DataView as DataView
10+import Data.ArrayBuffer.Typed (fromArray)
11+import Data.ArrayBuffer.Types (Uint8Array)
812import Data.Either (Either(..))
13+import Data.Enum (fromEnum)
914import Data.List (fromFoldable)
1015import Data.List as List
1116import Data.Maybe (Maybe(..))
@@ -13,12 +18,18 @@ import Data.Traversable (for_)
1318import Data.Tuple (Tuple(..))
1419import Data.UInt (fromInt)
1520import Effect (Effect)
21+import Effect.Class (liftEffect)
1622import Effect.Console (logShow)
17−import Parsing (ParserT, Position(..), fail, parseErrorPosition, runParserT)
23+import Effect.Exception (catchException, message)
24+import Parsing (ParseError(..), ParserT, Position(..), fail, liftExceptT, parseErrorPosition, runParserT)
1825import Parsing.Combinators (many, manyTill)
19−import Parsing.DataView (anyInt8)
26+import Parsing.DataView (anyInt8, anyTill, eof, satisfyInt8)
2027import Parsing.DataView as DV
28+import Parsing.DataView.Basic (anyCodePointUTF8)
2129import Test.Assert (assert', assertEqual')
30+import Web.Encoding.TextDecoder as TextDecoder
31+import Web.Encoding.TextEncoder as TextEncoder
32+import Web.Encoding.UtfLabel as UtfLabel
2233
2334parseTestT :: forall s a. Show a => Eq a => s -> a -> ParserT s Effect a -> Effect Unit
2435parseTestT input expected p = do
@@ -138,3 +149,83 @@ main = do
138149 { actual: x
139150 , expected: Right 200000
140151 }
152+
153+ do
154+ let
155+ teststring = "test string 👓"
156+
157+ textDecoder <- TextDecoder.new UtfLabel.utf8
158+
159+ textEncoder <- TextEncoder.new
160+
161+ let testarray = TextEncoder.encode teststring textEncoder
162+
163+ testview <- fromUint8Array testarray
164+
165+ result <- runParserT testview do
166+ let length = DataView.byteLength testview
167+ stringview <- DV.takeN length
168+ stringarray <- lift $ liftEffect $ toUint8Array stringview
169+ liftExceptT $ ExceptT $ catchException (pure <<< Left <<< message) do
170+ Right <$> TextDecoder.decode stringarray textDecoder
171+
172+ assertEqual' "UTF-8 decoding example"
173+ { expected: Right teststring
174+ , actual: result
175+ }
176+
177+ do
178+ result <- runParserT dv do
179+ Tuple pre _ <- anyTill do
180+ _ <- satisfyInt8 (_ == 7)
181+ _ <- satisfyInt8 (_ == 8)
182+ pure unit
183+ pure pre
184+
185+ assertEqual' "anyTill"
186+ { expected: Right 2
187+ , actual: DataView.byteLength <$> result
188+ }
189+
190+ do
191+ -- Test one code point from each byte group
192+ -- a 97
193+ -- λ 955
194+ -- 月 0x6708
195+ -- 👓 0x1F453
196+ let teststring = "aλ月👓a"
197+ textEncoder <- TextEncoder.new
198+ let testarray = TextEncoder.encode teststring textEncoder
199+ testview <- fromUint8Array testarray
200+
201+ result <- (map <<< map <<< map) fromEnum $ runParserT testview do
202+ c0 <- anyCodePointUTF8
203+ c1 <- anyCodePointUTF8
204+ c2 <- anyCodePointUTF8
205+ c3 <- anyCodePointUTF8
206+ c4 <- anyCodePointUTF8
207+ eof
208+ pure [ c0, c1, c2, c3, c4 ]
209+
210+ assertEqual' "anyCodePointUTF8 basic"
211+ { expected: Right [ 97, 955, 0x6708, 0x1F453, 97 ]
212+ , actual: result
213+ }
214+
215+ do
216+ test :: Uint8Array <- fromArray (map fromInt [ 0x00BF ])
217+ testv <- fromUint8Array test
218+ result <- runParserT testv anyCodePointUTF8
219+ assertEqual' "anyCodePointUTF8 invalid 1"
220+ { expected: Left (ParseError "Invalid UTF-8 encoding" (Position { index: 0, column: 1, line: 1 }))
221+ , actual: result
222+ }
223+
224+ do
225+ test :: Uint8Array <- fromArray (map fromInt [ 0x00C0, 0 ])
226+ testv <- fromUint8Array test
227+ result <- runParserT testv anyCodePointUTF8
228+ assertEqual' "anyCodePointUTF8 invalid 2"
229+ { expected: Left (ParseError "Invalid UTF-8 encoding" (Position { index: 0, column: 1, line: 1 }))
230+ , actual: result
231+ }