on master help sign in
Bug fixes and doctest fixes
ca30a84Hamish Mackenzie
jsaddle.cabal+3−3
@@ -1,5 +1,5 @@
1name: jsaddle
1name: jsaddle
2−version: 0.3.0.1
2+version: 0.3.0.2
3cabal-version: >=1.10
3cabal-version: >=1.10
4build-type: Simple
4build-type: Simple
5license: MIT
5license: MIT
@@ -32,12 +32,12 @@ library
32 build-depends:
32 build-depends:
33 gtk3 >=0.14.2 && <0.15,
33 gtk3 >=0.14.2 && <0.15,
34 webkitgtk3 >=0.13.0.0 && <0.15,
34 webkitgtk3 >=0.13.0.0 && <0.15,
35− webkitgtk3-javascriptcore >=0.13.0.0 && <0.14
35+ webkitgtk3-javascriptcore >=0.13.1.2 && <0.14
36 else
36 else
37 build-depends:
37 build-depends:
38 gtk >=0.14.2 && <0.15,
38 gtk >=0.14.2 && <0.15,
39 webkit >=0.13.0.0 && <0.15,
39 webkit >=0.13.0.0 && <0.15,
40− webkit-javascriptcore >=0.13.0.0 && <0.14
40+ webkit-javascriptcore >=0.13.1.2 && <0.14
41 build-depends:
41 build-depends:
42 glib -any
42 glib -any
43 exposed-modules:
43 exposed-modules:
src/Language/Javascript/JSaddle/Evaluate.hs+3−1
@@ -47,12 +47,14 @@ import Language.Javascript.JSaddle.Monad (JSM)
47-- >>> import Language.Javascript.JSaddle.Object (global, array, (!))
47-- >>> import Language.Javascript.JSaddle.Object (global, array, (!))
48-- >>> import Language.Javascript.JSaddle.Monad (catch)
48-- >>> import Language.Javascript.JSaddle.Monad (catch)
49-- >>> import Language.Javascript.JSaddle.Exception (JSException(..))
49-- >>> import Language.Javascript.JSaddle.Exception (JSException(..))
50+-- >>> testJSaddle $ return ()
51+-- ...
50
52
51-- | Evaluates a script (like eval in java script). Unlike 'eval' this function lets you
53-- | Evaluates a script (like eval in java script). Unlike 'eval' this function lets you
52-- specify a source URL and starting line number for beter error information.
54-- specify a source URL and starting line number for beter error information.
53--
55--
54-- >>> testJSaddle $ (evaluateScript "\n\n{" global "FileName" 53 >>= valToText) `catch` \(JSException e) -> array (e,e!"sourceURL", e!"line") >>= valToText
56-- >>> testJSaddle $ (evaluateScript "\n\n{" global "FileName" 53 >>= valToText) `catch` \(JSException e) -> array (e,e!"sourceURL", e!"line") >>= valToText
55−-- SyntaxError: Expected token '}',FileName,55
57+-- SyntaxError: Unexpected end of script,FileName,55
56evaluateScript :: (ToJSString script, MakeObject this, ToJSString url)
58evaluateScript :: (ToJSString script, MakeObject this, ToJSString url)
57 => script -- ^ JavaScript to evaluate
59 => script -- ^ JavaScript to evaluate
58 -> this
60 -> this
src/Language/Javascript/JSaddle/Native.hs+7−2
@@ -30,8 +30,8 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
30 (JSObjectRef, OpaqueJSString, JSStringRef, OpaqueJSContext,
30 (JSObjectRef, OpaqueJSString, JSStringRef, OpaqueJSContext,
31 OpaqueJSValue, JSValueRef)
31 OpaqueJSValue, JSValueRef)
32import Foreign.ForeignPtr
32import Foreign.ForeignPtr
33− (touchForeignPtr, FinalizerPtr, newForeignPtr, FinalizerEnvPtr,
33+ (newForeignPtr_, touchForeignPtr, FinalizerPtr, newForeignPtr,
34− newForeignPtrEnv, ForeignPtr)
34+ FinalizerEnvPtr, newForeignPtrEnv, ForeignPtr)
35import Control.Monad.IO.Class (MonadIO, MonadIO(..))
35import Control.Monad.IO.Class (MonadIO, MonadIO(..))
36import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
36import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
37 (jsvalueprotect)
37 (jsvalueprotect)
@@ -41,6 +41,7 @@ import Language.Javascript.JSaddle.Types
41 (JSM, JSString, Object(..), JSVal)
41 (JSM, JSString, Object(..), JSVal)
42import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)
42import Foreign.ForeignPtr.Unsafe (unsafeForeignPtrToPtr)
43import Language.Javascript.JSaddle.Classes (ToJSVal(..), ToJSVal)
43import Language.Javascript.JSaddle.Classes (ToJSVal(..), ToJSVal)
44+import Foreign.Ptr (nullPtr)
44
45
45makeNewJSVal :: JSValueRef -> JSM (ForeignPtr OpaqueJSValue)
46makeNewJSVal :: JSValueRef -> JSM (ForeignPtr OpaqueJSValue)
46makeNewJSVal val = do
47makeNewJSVal val = do
@@ -53,12 +54,16 @@ foreign import ccall unsafe "&JSValueUnprotect"
53 jsValueUnprotect :: FinalizerEnvPtr OpaqueJSContext OpaqueJSValue
54 jsValueUnprotect :: FinalizerEnvPtr OpaqueJSContext OpaqueJSValue
54
55
55makeNewJSString :: MonadIO m => JSStringRef -> m (ForeignPtr OpaqueJSString)
56makeNewJSString :: MonadIO m => JSStringRef -> m (ForeignPtr OpaqueJSString)
57+makeNewJSString s | s == nullPtr =
58+ liftIO $ newForeignPtr_ s
56makeNewJSString s =
59makeNewJSString s =
57 liftIO $ do
60 liftIO $ do
58 s' <- jsstringretain s
61 s' <- jsstringretain s
59 newForeignPtr jsStringRelease s'
62 newForeignPtr jsStringRelease s'
60
63
61wrapJSString :: MonadIO m => JSStringRef -> m (ForeignPtr OpaqueJSString)
64wrapJSString :: MonadIO m => JSStringRef -> m (ForeignPtr OpaqueJSString)
65+wrapJSString s | s == nullPtr =
66+ liftIO $ newForeignPtr_ s
62wrapJSString s = liftIO $ newForeignPtr jsStringRelease s
67wrapJSString s = liftIO $ newForeignPtr jsStringRelease s
63
68
64foreign import ccall unsafe "&JSStringRelease"
69foreign import ccall unsafe "&JSStringRelease"
src/Language/Javascript/JSaddle/Object.hs+40−22
@@ -112,8 +112,8 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
112 jspropertynamearraygetcount, jsobjectcopypropertynames,
112 jspropertynamearraygetcount, jsobjectcopypropertynames,
113 jsobjectcallasconstructor, jsobjectmakearray,
113 jsobjectcallasconstructor, jsobjectmakearray,
114 jsobjectcallasfunction,
114 jsobjectcallasfunction,
115− JSObjectCallAsFunctionCallback,
115+ JSObjectCallAsFunctionCallback, mkJSObjectCallAsFunctionCallback,
116− jsobjectmakefunctionwithcallback, JSObjectCallAsFunctionCallback')
116+ jsobjectmakefunctionwithcallback)
117import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
117import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
118 (jsvaluemakeundefined)
118 (jsvaluemakeundefined)
119import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSContextRef
119import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSContextRef
@@ -121,8 +121,8 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSContextRef
121import Foreign (peekArray, nullPtr, withArrayLen)
121import Foreign (peekArray, nullPtr, withArrayLen)
122import Foreign.Ptr (freeHaskellFunPtr)
122import Foreign.Ptr (freeHaskellFunPtr)
123import Language.Javascript.JSaddle.Native
123import Language.Javascript.JSaddle.Native
124− (makeNewJSVal, wrapJSString, withJSVals, withObject, withJSString,
124+ (makeNewJSString, makeNewJSVal, wrapJSString, withJSVals,
125− withToJSVal)
125+ withObject, withJSString, withToJSVal)
126import System.IO.Unsafe (unsafePerformIO)
126import System.IO.Unsafe (unsafePerformIO)
127import Foreign.ForeignPtr (newForeignPtr_)
127import Foreign.ForeignPtr (newForeignPtr_)
128#endif
128#endif
@@ -147,8 +147,9 @@ import Data.Text (Text)
147-- $setup
147-- $setup
148-- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
148-- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
149-- >>> import Language.Javascript.JSaddle.Evaluate (eval)
149-- >>> import Language.Javascript.JSaddle.Evaluate (eval)
150−-- >>> import Language.Javascript.JSaddle.Value (val)
150+-- >>> import Language.Javascript.JSaddle.Value (val, valToText, JSNull(..))
151-- >>> import Control.Lens.Operators ((^.))
151-- >>> import Control.Lens.Operators ((^.))
152+-- >>> import qualified Data.Text as T (unpack)
152
153
153-- | Object can be made by evaluating a fnction in 'JSM' as long
154-- | Object can be made by evaluating a fnction in 'JSM' as long
154-- as it returns something we can make into a Object.
155-- as it returns something we can make into a Object.
@@ -159,6 +160,7 @@ instance MakeObject v => MakeObject (JSM v) where
159-- | Lookup a property based on its name.
160-- | Lookup a property based on its name.
160--
161--
161-- >>> testJSaddle $ eval "'Hello World'.length"
162-- >>> testJSaddle $ eval "'Hello World'.length"
163+-- 11
162-- >>> testJSaddle $ val "Hello World" ! "length"
164-- >>> testJSaddle $ val "Hello World" ! "length"
163-- 11
165-- 11
164(!) :: (MakeObject this, ToJSString name)
166(!) :: (MakeObject this, ToJSString name)
@@ -175,6 +177,7 @@ this ! name = do
175-- | Lookup a property based on its index.
177-- | Lookup a property based on its index.
176--
178--
177-- >>> testJSaddle $ eval "'Hello World'[6]"
179-- >>> testJSaddle $ eval "'Hello World'[6]"
180+-- W
178-- >>> testJSaddle $ val "Hello World" !! 6
181-- >>> testJSaddle $ val "Hello World" !! 6
179-- W
182-- W
180(!!) :: (MakeObject this)
183(!!) :: (MakeObject this)
@@ -191,6 +194,7 @@ this !! index = do
191-- > js name = to (!name)
194-- > js name = to (!name)
192--
195--
193-- >>> testJSaddle $ eval "'Hello World'.length"
196-- >>> testJSaddle $ eval "'Hello World'.length"
197+-- 11
194-- >>> testJSaddle $ val "Hello World" ^. js "length"
198-- >>> testJSaddle $ val "Hello World" ^. js "length"
195-- 11
199-- 11
196js :: (MakeObject s, ToJSString name)
200js :: (MakeObject s, ToJSString name)
@@ -204,6 +208,7 @@ js name = to (!name)
204-- > jss name = to (<#name)
208-- > jss name = to (<#name)
205--
209--
206-- >>> testJSaddle $ eval "'Hello World'.length"
210-- >>> testJSaddle $ eval "'Hello World'.length"
211+-- 11
207-- >>> testJSaddle $ val "Hello World" ^. js "length"
212-- >>> testJSaddle $ val "Hello World" ^. js "length"
208-- 11
213-- 11
209jss :: (ToJSString name, ToJSVal val)
214jss :: (ToJSString name, ToJSVal val)
@@ -275,8 +280,13 @@ js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
275-- | Handy way to get and hold onto a reference top level javascript
280-- | Handy way to get and hold onto a reference top level javascript
276--
281--
277-- >>> testJSaddle $ eval "w = console; w.log('Hello World')"
282-- >>> testJSaddle $ eval "w = console; w.log('Hello World')"
283+-- ** Message: console message: @1: Hello World
284+-- <BLANKLINE>
285+-- undefined
278−-- >>> testJSaddle $ do w <- jsg "console"; w ^. js "log" # ["Hello World"]
286+-- >>> testJSaddle $ do w <- jsg "console"; w ^. js1 "log" "Hello World"
279−-- 11
287+-- ** Message: console message: [native code] @0: Hello World
288+-- <BLANKLINE>
289+-- undefined
280jsg :: ToJSString a => a -> JSM JSVal
290jsg :: ToJSString a => a -> JSM JSVal
281jsg name = global ! name
291jsg name = global ! name
282{-# INLINE jsg #-}
292{-# INLINE jsg #-}
@@ -285,9 +295,10 @@ jsg name = global ! name
285--
295--
286-- > jsgf name = jsg name . to (# args)
296-- > jsgf name = jsg name . to (# args)
287--
297--
288−-- >>> testJSaddle $ eval "globalFunc = function(x) {x.length}"
298+-- >>> testJSaddle $ eval "globalFunc = function (x) {return x.length;}"
299+-- function (x) {return x.length;}
289-- >>> testJSaddle $ jsgf "globalFunc" ["World"]
300-- >>> testJSaddle $ jsgf "globalFunc" ["World"]
290−-- 6
301+-- 5
291jsgf :: (ToJSString name, MakeArgs args) => name -> args -> JSM JSVal
302jsgf :: (ToJSString name, MakeArgs args) => name -> args -> JSM JSVal
292jsgf name = global # name
303jsgf name = global # name
293{-# INLINE jsgf #-}
304{-# INLINE jsgf #-}
@@ -297,7 +308,7 @@ jsgf name = global # name
297-- > jsg0 name = jsgf name ()
308-- > jsg0 name = jsgf name ()
298--
309--
299-- >>> testJSaddle $ jsg0 "globalFunc"
310-- >>> testJSaddle $ jsg0 "globalFunc"
300−-- hello world
311+-- TypeError: undefined is not an object (evaluating 'x.length')
301jsg0 :: (ToJSString name) => name -> JSM JSVal
312jsg0 :: (ToJSString name) => name -> JSM JSVal
302jsg0 name = jsgf name ()
313jsg0 name = jsgf name ()
303{-# INLINE jsg0 #-}
314{-# INLINE jsg0 #-}
@@ -307,7 +318,7 @@ jsg0 name = jsgf name ()
307-- > jsg1 name a0 = jsgf name [a0]
318-- > jsg1 name a0 = jsgf name [a0]
308--
319--
309-- >>> testJSaddle $ jsg1 "globalFunc" "World"
320-- >>> testJSaddle $ jsg1 "globalFunc" "World"
310−-- 6
321+-- 5
311jsg1 :: (ToJSString name, ToJSVal a0) => name -> a0 -> JSM JSVal
322jsg1 :: (ToJSString name, ToJSVal a0) => name -> a0 -> JSM JSVal
312jsg1 name a0 = jsgf name [a0]
323jsg1 name a0 = jsgf name [a0]
313{-# INLINE jsg1 #-}
324{-# INLINE jsg1 #-}
@@ -340,6 +351,7 @@ jsg5 name a0 a1 a2 a3 a4 = jsgf name (a0, a1, a2, a3, a4)
340-- | Call a JavaScript function
351-- | Call a JavaScript function
341--
352--
342-- >>> testJSaddle $ eval "'Hello World'.indexOf('World')"
353-- >>> testJSaddle $ eval "'Hello World'.indexOf('World')"
354+-- 6
343-- >>> testJSaddle $ val "Hello World" # "indexOf" $ ["World"]
355-- >>> testJSaddle $ val "Hello World" # "indexOf" $ ["World"]
344-- 6
356-- 6
345infixr 2 #
357infixr 2 #
@@ -354,8 +366,10 @@ infixr 2 #
354
366
355-- | Call a JavaScript function
367-- | Call a JavaScript function
356--
368--
357−-- >>> testJSaddle $ eval "something[6]('World')"
369+-- >>> testJSaddle $ eval "something = {}; something[6]=function (x) {return x.length;}; something[6]('World')"
370+-- 5
358−-- >>> testJSaddle $ val something ## 6 ["World"]
371+-- >>> testJSaddle $ jsg "something" ## 6 $ ["World"]
372+-- 5
359infixr 2 ##
373infixr 2 ##
360(##) :: (MakeObject this, MakeArgs args)
374(##) :: (MakeObject this, MakeArgs args)
361 => this -> Index -> args -> JSM JSVal
375 => this -> Index -> args -> JSM JSVal
@@ -369,7 +383,8 @@ infixr 2 ##
369-- | Set a JavaScript property
383-- | Set a JavaScript property
370--
384--
371-- >>> testJSaddle $ eval "var j = {}; j.x = 1; j.x"
385-- >>> testJSaddle $ eval "var j = {}; j.x = 1; j.x"
386+-- 1
372−-- >>> testJSaddle $ do {j <- eval "({})"; j <# "x" 1; j!"x"}
387+-- >>> testJSaddle $ do {j <- obj; (j <# "x") 1; j!"x"}
373-- 1
388-- 1
374infixr 1 <#
389infixr 1 <#
375(<#) :: (MakeObject this, ToJSString name, ToJSVal val)
390(<#) :: (MakeObject this, ToJSString name, ToJSVal val)
@@ -385,7 +400,8 @@ infixr 1 <#
385-- | Set a JavaScript property
400-- | Set a JavaScript property
386--
401--
387-- >>> testJSaddle $ eval "var j = {}; j[6] = 1; j[6]"
402-- >>> testJSaddle $ eval "var j = {}; j[6] = 1; j[6]"
403+-- 1
388−-- >>> testJSaddle $ do {j <- eval "({})"; j <## 6 1; j!!6}
404+-- >>> testJSaddle $ do {j <- obj; (j <## 6) 1; j!!6}
389-- 1
405-- 1
390infixr 1 <##
406infixr 1 <##
391(<##) :: (MakeObject this, ToJSVal val)
407(<##) :: (MakeObject this, ToJSVal val)
@@ -417,6 +433,7 @@ new constructor args = do
417-- | Call function with a given @this@. In most cases you should use '#'.
433-- | Call function with a given @this@. In most cases you should use '#'.
418--
434--
419-- >>> testJSaddle $ eval "(function(){return this;}).apply('Hello', [])"
435-- >>> testJSaddle $ eval "(function(){return this;}).apply('Hello', [])"
436+-- Hello
420-- >>> testJSaddle $ do { test <- eval "(function(){return this;})"; call test (val "Hello") () }
437-- >>> testJSaddle $ do { test <- eval "(function(){return this;})"; call test (val "Hello") () }
421-- Hello
438-- Hello
422call :: (MakeObject f, MakeObject this, MakeArgs args)
439call :: (MakeObject f, MakeObject this, MakeArgs args)
@@ -430,7 +447,8 @@ call f this args = do
430-- | Make an empty object using the default constuctor
447-- | Make an empty object using the default constuctor
431--
448--
432-- >>> testJSaddle $ eval "var a = {}; a.x = 'Hello'; a.x"
449-- >>> testJSaddle $ eval "var a = {}; a.x = 'Hello'; a.x"
450+-- Hello
433−-- >>> testJSaddle $ do { a <- obj; a ^. js "x" <# "Hello"; a ^. js "x" }
451+-- >>> testJSaddle $ do { a <- obj; (a <# "x") "Hello"; a ^. js "x" }
434-- Hello
452-- Hello
435obj :: JSM Object
453obj :: JSM Object
436#ifdef ghcjs_HOST_OS
454#ifdef ghcjs_HOST_OS
@@ -456,6 +474,9 @@ type JSCallAsFunction = JSVal -- ^ Function object
456-- a to a JavaScipt one.
474-- a to a JavaScipt one.
457--
475--
458-- >>> testJSaddle $ eval "(function(f) {f('Hello');})(function (a) {console.log(a)})"
476-- >>> testJSaddle $ eval "(function(f) {f('Hello');})(function (a) {console.log(a)})"
477+-- ** Message: console message: @1: Hello
478+-- <BLANKLINE>
479+-- undefined
459-- >>> testJSaddle $ call (eval "(function(f) {f('Hello');})") global [fun $ \ _ _ args -> valToText (head args) >>= (liftIO . putStrLn . T.unpack) ]
480-- >>> testJSaddle $ call (eval "(function(f) {f('Hello');})") global [fun $ \ _ _ args -> valToText (head args) >>= (liftIO . putStrLn . T.unpack) ]
460-- Hello
481-- Hello
461-- undefined
482-- undefined
@@ -463,11 +484,6 @@ fun :: JSCallAsFunction -> JSCallAsFunction
463fun = id
484fun = id
464{-# INLINE fun #-}
485{-# INLINE fun #-}
465
486
466−#if !defined(ghcjs_HOST_OS)
467−foreign import ccall "wrapper"
468− mkJSObjectCallAsFunctionCallback :: JSObjectCallAsFunctionCallback' -> IO JSObjectCallAsFunctionCallback
469−#endif
470−
471#ifdef ghcjs_HOST_OS
487#ifdef ghcjs_HOST_OS
472type HaskellCallback = Callback (JSVal -> JSVal -> IO ())
488type HaskellCallback = Callback (JSVal -> JSVal -> IO ())
473#else
489#else
@@ -557,9 +573,11 @@ makeArray args exceptions = do
557-- | Make an JavaScript array from a list of values
573-- | Make an JavaScript array from a list of values
558--
574--
559-- >>> testJSaddle $ eval "['Hello', 'World'][1]"
575-- >>> testJSaddle $ eval "['Hello', 'World'][1]"
576+-- World
560-- >>> testJSaddle $ array ["Hello", "World"] !! 1
577-- >>> testJSaddle $ array ["Hello", "World"] !! 1
561-- World
578-- World
562-- >>> testJSaddle $ eval "['Hello', null, undefined, true, 1]"
579-- >>> testJSaddle $ eval "['Hello', null, undefined, true, 1]"
580+-- Hello,,,true,1
563-- >>> testJSaddle $ array ("Hello", JSNull, (), True, 1.0::Double)
581-- >>> testJSaddle $ array ("Hello", JSNull, (), True, 1.0::Double)
564-- Hello,,,true,1
582-- Hello,,,true,1
565array :: MakeArgs args => args -> JSM Object
583array :: MakeArgs args => args -> JSM Object
@@ -634,7 +652,7 @@ propertyNamesCount names = liftIO $ jspropertynamearraygetcount names
634
652
635-- | Get a name out of a property name array
653-- | Get a name out of a property name array
636propertyNamesAt :: MonadIO m => JSPropertyNameArray -> CSize -> m JSString
654propertyNamesAt :: MonadIO m => JSPropertyNameArray -> CSize -> m JSString
637−propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index >>= wrapJSString
655+propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index >>= makeNewJSString
638{-# INLINE propertyNamesAt #-}
656{-# INLINE propertyNamesAt #-}
639
657
640-- | Convert property array to a list
658-- | Convert property array to a list
src/Language/Javascript/JSaddle/Test.hs+1−1
@@ -62,7 +62,7 @@ showJSaddle :: ToJSVal val => JSM val -> IO ()
62showJSaddle = testJSaddle' True
62showJSaddle = testJSaddle' True
63
63
64debugLog :: String -> IO ()
64debugLog :: String -> IO ()
65−debugLog = putStrLn
65+debugLog _ = return ()
66
66
67testJSaddle' :: ToJSVal val => Bool -> JSM val -> IO ()
67testJSaddle' :: ToJSVal val => Bool -> JSM val -> IO ()
68testJSaddle' showWindow f = do
68testJSaddle' showWindow f = do
src/Language/Javascript/JSaddle/Value.hs+23−21
@@ -111,6 +111,8 @@ import Data.Int (Int32, Int64)
111-- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
111-- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
112-- >>> import Language.Javascript.JSaddle.Monad (catch)
112-- >>> import Language.Javascript.JSaddle.Monad (catch)
113-- >>> import Language.Javascript.JSaddle.Exception (JSException(..))
113-- >>> import Language.Javascript.JSaddle.Exception (JSException(..))
114+-- >>> import Language.Javascript.JSaddle.Object (obj)
115+-- >>> import qualified Data.Text as T (pack)
114
116
115data JSNull = JSNull -- ^ Type that represents a value that can only be null.
117data JSNull = JSNull -- ^ Type that represents a value that can only be null.
116 -- Haskell of course has no null so we are adding this type.
118 -- Haskell of course has no null so we are adding this type.
@@ -218,7 +220,7 @@ valToNumber value = do
218-- >>> testJSaddle $ valToStr (0.0 :: Double) >>= strToText
220-- >>> testJSaddle $ valToStr (0.0 :: Double) >>= strToText
219-- 0
221-- 0
220-- >>> testJSaddle $ valToStr "" >>= strToText
222-- >>> testJSaddle $ valToStr "" >>= strToText
221−--
223+-- <BLANKLINE>
222-- >>> testJSaddle $ valToStr "1" >>= strToText
224-- >>> testJSaddle $ valToStr "1" >>= strToText
223-- 1
225-- 1
224valToStr :: ToJSVal value => value -> JSM JSString
226valToStr :: ToJSVal value => value -> JSM JSString
@@ -263,7 +265,7 @@ valToText jsvar = valToStr jsvar >>= strToText
263-- >>> testJSaddle $ valToJSON 0 JSNull >>= strToText
265-- >>> testJSaddle $ valToJSON 0 JSNull >>= strToText
264-- null
266-- null
265-- >>> testJSaddle $ valToJSON 0 () >>= strToText
267-- >>> testJSaddle $ valToJSON 0 () >>= strToText
266−--
268+-- <BLANKLINE>
267-- >>> testJSaddle $ valToJSON 0 True >>= strToText
269-- >>> testJSaddle $ valToJSON 0 True >>= strToText
268-- true
270-- true
269-- >>> testJSaddle $ valToJSON 0 False >>= strToText
271-- >>> testJSaddle $ valToJSON 0 False >>= strToText
@@ -295,9 +297,9 @@ valToJSON indent value = do
295-- May throw JSException.
297-- May throw JSException.
296--
298--
297-- >>> testJSaddle $ (valToObject JSNull >>= valToText) `catch` \ (JSException e) -> valToText e
299-- >>> testJSaddle $ (valToObject JSNull >>= valToText) `catch` \ (JSException e) -> valToText e
298−-- TypeError: 'null' is not an object
300+-- TypeError: null is not an object
299-- >>> testJSaddle $ (valToObject () >>= valToText) `catch` \ (JSException e) -> valToText e
301-- >>> testJSaddle $ (valToObject () >>= valToText) `catch` \ (JSException e) -> valToText e
300−-- TypeError: 'undefined' is not an object
302+-- TypeError: undefined is not an object
301-- >>> testJSaddle $ valToObject True
303-- >>> testJSaddle $ valToObject True
302-- true
304-- true
303-- >>> testJSaddle $ valToObject False
305-- >>> testJSaddle $ valToObject False
@@ -307,7 +309,7 @@ valToJSON indent value = do
307-- >>> testJSaddle $ valToObject (0.0 :: Double)
309-- >>> testJSaddle $ valToObject (0.0 :: Double)
308-- 0
310-- 0
309-- >>> testJSaddle $ valToObject ""
311-- >>> testJSaddle $ valToObject ""
310−--
312+-- <BLANKLINE>
311-- >>> testJSaddle $ valToObject "1"
313-- >>> testJSaddle $ valToObject "1"
312-- 1
314-- 1
313valToObject :: ToJSVal value => value -> JSM Object
315valToObject :: ToJSVal value => value -> JSM Object
@@ -578,23 +580,23 @@ instance ToJSString String where
578-- | Derefernce a value reference.
580-- | Derefernce a value reference.
579--
581--
580-- >>> testJSaddle $ showJSValue <$> deRefVal JSNull
582-- >>> testJSaddle $ showJSValue <$> deRefVal JSNull
581−-- ValNull
583+-- null
582-- >>> testJSaddle $ showJSValue <$> deRefVal ()
584-- >>> testJSaddle $ showJSValue <$> deRefVal ()
583−-- ValUndefined
585+-- undefined
584-- >>> testJSaddle $ showJSValue <$> deRefVal True
586-- >>> testJSaddle $ showJSValue <$> deRefVal True
585−-- ValBool True
587+-- true
586-- >>> testJSaddle $ showJSValue <$> deRefVal False
588-- >>> testJSaddle $ showJSValue <$> deRefVal False
587−-- ValBool False
589+-- false
588-- >>> testJSaddle $ showJSValue <$> deRefVal (1.0 :: Double)
590-- >>> testJSaddle $ showJSValue <$> deRefVal (1.0 :: Double)
589−-- ValNumber 1.0
591+-- 1.0
590-- >>> testJSaddle $ showJSValue <$> deRefVal (0.0 :: Double)
592-- >>> testJSaddle $ showJSValue <$> deRefVal (0.0 :: Double)
591−-- ValNumber 0.0
593+-- 0.0
592-- >>> testJSaddle $ showJSValue <$> deRefVal ""
594-- >>> testJSaddle $ showJSValue <$> deRefVal ""
593−-- ValString ""
595+-- ""
594-- >>> testJSaddle $ showJSValue <$> deRefVal "1"
596-- >>> testJSaddle $ showJSValue <$> deRefVal "1"
595−-- ValString "1"
597+-- "1"
596−-- >>> testJSaddle $ showJSValue <$> valToObject True >>= deRefVal
598+-- >>> testJSaddle $ showJSValue <$> (valToObject True >>= deRefVal)
597−-- ValObject 0x...
599+-- object
598deRefVal :: ToJSVal value => value -> JSM JSValue
600deRefVal :: ToJSVal value => value -> JSM JSValue
599#ifdef ghcjs_HOST_OS
601#ifdef ghcjs_HOST_OS
600deRefVal value = do
602deRefVal value = do
@@ -629,15 +631,15 @@ deRefVal value = do
629-- | Make a JavaScript value out of a 'JSValue' ADT.
631-- | Make a JavaScript value out of a 'JSValue' ADT.
630--
632--
631-- >>> testJSaddle $ valMakeRef ValNull
633-- >>> testJSaddle $ valMakeRef ValNull
632−-- "null"
634+-- null
633-- >>> testJSaddle $ valMakeRef ValUndefined
635-- >>> testJSaddle $ valMakeRef ValUndefined
634−-- "undefined"
636+-- undefined
635-- >>> testJSaddle $ valMakeRef (ValBool True)
637-- >>> testJSaddle $ valMakeRef (ValBool True)
636−-- "true"
638+-- true
637-- >>> testJSaddle $ valMakeRef (ValNumber 1)
639-- >>> testJSaddle $ valMakeRef (ValNumber 1)
638−-- "1"
640+-- 1
639−-- >>> testJSaddle $ valMakeRef (ValString $ pack "Hello")
641+-- >>> testJSaddle $ valMakeRef (ValString $ T.pack "Hello")
640−-- "Hello"
642+-- Hello
641valMakeRef :: JSValue -> JSM JSVal
643valMakeRef :: JSValue -> JSM JSVal
642valMakeRef value =
644valMakeRef value =
643 case value of
645 case value of
tests/DocTest.hs+22−1
@@ -1,3 +1,4 @@
1+{-# LANGUAGE CPP #-}
1module Main (
2module Main (
2 main
3 main
3) where
4) where
@@ -5,7 +6,27 @@ module Main (
5import Test.DocTest
6import Test.DocTest
6
7
7main :: IO ()
8main :: IO ()
8−main = doctest ["-isrc",
9+main = doctest [
10+ "-idist/build/autgen",
11+ "-optP-include",
12+ "-optPdist/build/autogen/cabal_macros.h",
13+ "-hide-all-packages",
14+#ifdef VERSION_gtk3
15+ "-package=gtk3-" ++ VERSION_gtk3,
16+ "-package=webkitgtk3-" ++ VERSION_webkitgtk3,
17+ "-package=webkitgtk3-javascriptcore-" ++ VERSION_webkitgtk3_javascriptcore,
18+#else
19+ "-package=gtk-" ++ VERSION_gtk,
20+ "-package=webkit-" ++ VERSION_webkit,
21+ "-package=webkit-javascriptcore-" ++ VERSION_webkit_javascriptcore,
22+#endif
23+ "-package=glib-" ++ VERSION_glib,
24+ "-package=template-haskell-" ++ VERSION_template_haskell,
25+ "-package=base-" ++ VERSION_base,
26+ "-package=lens-" ++ VERSION_lens,
27+ "-package=text-" ++ VERSION_text,
28+ "-package=transformers-" ++ VERSION_transformers,
29+ "-isrc",
9 "src/Language/Javascript/JSaddle/Arguments.hs",
30 "src/Language/Javascript/JSaddle/Arguments.hs",
10 "src/Language/Javascript/JSaddle/Classes.hs",
31 "src/Language/Javascript/JSaddle/Classes.hs",
11 "src/Language/Javascript/JSaddle/Evaluate.hs",
32 "src/Language/Javascript/JSaddle/Evaluate.hs",