125 lines
3.2 KiB
Racket
125 lines
3.2 KiB
Racket
#lang s-exp "../../lang/base.rkt"
|
|
|
|
|
|
(require "../../ffi/ffi.rkt"
|
|
"../../lang/check-expect/check-expect.rkt")
|
|
|
|
|
|
(define window
|
|
(js-get-global-value "window"))
|
|
|
|
(define platform
|
|
(js-get-field window "navigator" "platform"))
|
|
|
|
(printf "Current browser platform is ~s\n"
|
|
(prim-js->scheme platform))
|
|
|
|
|
|
(check-expect (prim-js->scheme (scheme->prim-js "hello world"))
|
|
"hello world")
|
|
(check-expect (prim-js->scheme (scheme->prim-js #t))
|
|
#t)
|
|
(check-expect (prim-js->scheme (scheme->prim-js #f))
|
|
#f)
|
|
|
|
|
|
(printf "minimum and maximum js fixnums are ~a and ~a\n"
|
|
minimum-js-fixnum
|
|
maximum-js-fixnum)
|
|
|
|
|
|
|
|
;; (prim-js->scheme (scheme->prim-js ...)) is not the identity, unfortunately.
|
|
;; Here are tests that show that we need to do something:
|
|
|
|
;; Numbers that come back to us are inexact.
|
|
(check-expect (inexact->exact (prim-js->scheme (scheme->prim-js 42)))
|
|
42)
|
|
|
|
;; Characters are mapped to one-character strings.
|
|
(check-expect (prim-js->scheme (scheme->prim-js #\h))
|
|
"h")
|
|
|
|
;; Symbols are mapped to strings.
|
|
(check-expect (prim-js->scheme (scheme->prim-js 'hello))
|
|
"hello")
|
|
|
|
;; Note that when converting vectors, the resulting inner values are not
|
|
;; automatically transformed back. So the prim-js->scheme transformation
|
|
;; is shallow.
|
|
(check-expect (map prim-js->scheme
|
|
(vector->list (prim-js->scheme (scheme->prim-js #(1 2 3)))))
|
|
'(1.0 2.0 3.0))
|
|
|
|
(check-expect (map prim-js->scheme
|
|
(vector->list (prim-js->scheme
|
|
(scheme->prim-js #(1 "testing" 3)))))
|
|
'(1.0 "testing" 3.0))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(check-expect (js-=== js-undefined js-undefined) true)
|
|
(check-expect (js-=== js-null js-null) true)
|
|
(check-expect (js-=== js-undefined js-null) false)
|
|
(check-expect (js-=== js-null js-undefined) false)
|
|
|
|
|
|
(check-expect (js-typeof (scheme->prim-js 1)) "number")
|
|
(check-expect (js-typeof (scheme->prim-js "hello")) "string")
|
|
(check-expect (js-typeof (scheme->prim-js #t)) "boolean")
|
|
(check-expect (js-typeof (scheme->prim-js #f)) "boolean")
|
|
|
|
(check-expect (js-typeof (js-make-hash)) "object")
|
|
(check-expect (js-typeof (js-make-hash '(("name" "danny")
|
|
("school" "wpi")))) "object")
|
|
|
|
|
|
|
|
|
|
(define a-hash (js-make-hash '(("foo" "bar")
|
|
("baz" "blah"))))
|
|
(check-expect (prim-js->scheme (js-get-field a-hash "foo")) "bar")
|
|
(check-expect (prim-js->scheme (js-get-field a-hash "baz")) "blah")
|
|
(js-set-field! a-hash "something else" (box 3))
|
|
|
|
|
|
|
|
;; Uh oh. There's something about this that I do not understand about
|
|
;; the current design of the FFI. What's going on here?
|
|
(check-expect (js-get-field a-hash "something else")
|
|
(box 3))
|
|
|
|
|
|
|
|
(define my-escape
|
|
(let ([prim-escape (js-get-global-value "escape")])
|
|
(lambda (s)
|
|
(prim-js->scheme (js-call prim-escape #f s)))))
|
|
(check-expect (my-escape "hello world") "hello%20world")
|
|
(check-expect (my-escape "x.mv,") "x.mv%2C")
|
|
|
|
|
|
|
|
|
|
|
|
(let ([p (procedure->void-js-fun
|
|
(lambda () (printf "this is from scheme\n")))])
|
|
(printf "The following should repeat 'this is from scheme'\n")
|
|
(js-call p #f))
|
|
|
|
|
|
(let ([p (procedure->void-js-fun
|
|
(lambda (x y)
|
|
(printf "I see: ~s ~s\n"
|
|
(prim-js->scheme x)
|
|
(prim-js->scheme y))))])
|
|
(printf "The following should repeat 'I see 3 \"four\"\n")
|
|
(js-call p #f 3 "four"))
|
|
|
|
|
|
|
|
(run-tests)
|
|
"end of ffi tests" |