1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
(* Js_of_ocaml compiler
* http://www.ocsigen.org/js_of_ocaml/
* Copyright (C) 2017 Hugo Heuzard
* Copyright (C) 2019 Ty Overby
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, with linking exception;
* either version 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*)
(* https://github.com/ocsigen/js_of_ocaml/issues/739 *)
let print_bool b = print_endline (string_of_bool b)
let%expect_test "is_int" =
let r = ref false in
let f x =
match Obj.is_int x with
| true ->
r := true;
true
| false ->
r := false;
false
in
print_string "[not (is_int 1)]: ";
print_bool (not (f (Obj.repr 1)));
print_string "[is_int (1,2,3)]: ";
print_bool (f (Obj.repr (1, 2, 3)));
[%expect {|
[not (is_int 1)]: false
[is_int (1,2,3)]: false
|}]
(* https://github.com/ocsigen/js_of_ocaml/issues/666 *)
(* https://github.com/ocsigen/js_of_ocaml/pull/725 *)
external use_js_string : unit -> bool = "caml_jsoo_flags_use_js_string"
let%expect_test "dup string/bytes" =
let js_string_enabled = use_js_string () in
let s = "Hello" in
let s' : string = Obj.obj (Obj.dup (Obj.repr s)) in
print_bool (s = s');
print_bool (js_string_enabled = (s == s'));
[%expect {|
true
true |}];
let s = Bytes.of_string "Hello" in
let s' : bytes = Obj.obj (Obj.dup (Obj.repr s)) in
print_bool (s = s');
print_bool (s != s');
Bytes.set s' 1 'a';
print_bool (s <> s');
[%expect {|
true
true
true
|}]
let%expect_test "dup tuple" =
let x = 1, "a", 2.1 in
let x' = Obj.obj (Obj.dup (Obj.repr x)) in
print_bool (x = x');
print_bool (x != x');
[%expect {|
true
true
|}]
let%expect_test "dup numbers" =
let js =
match Sys.backend_type with
| Other "js_of_ocaml" -> true
| _ -> false
in
let x = 2.1 in
let x' = Obj.obj (Obj.dup (Obj.repr x)) in
print_bool (x = x');
print_bool ((not js) = (x != x'));
[%expect {|
true
true
|}];
let x = 21L in
let x' = Obj.obj (Obj.dup (Obj.repr x)) in
print_bool (x = x');
print_bool (x != x');
[%expect {|
true
true
|}];
let x = 21l in
let x' = Obj.obj (Obj.dup (Obj.repr x)) in
print_bool (x = x');
print_bool ((not js) = (x != x'));
[%expect {|
true
true
|}];
let x = 21n in
let x' = Obj.obj (Obj.dup (Obj.repr x)) in
print_bool (x = x');
print_bool ((not js) = (x != x'));
[%expect {|
true
true
|}]
let%expect_test "sameness" =
(* FIXME: Jsoo returns the wrong opposite result for cases below.
Would be fixed by GH#1410 *)
let f x =
match Sys.backend_type with
| Other "js_of_ocaml" -> not x
| Other _ | Native | Bytecode -> x
in
print_bool (f (nan == nan));
[%expect {| true |}];
print_bool (f (-0. == 0.));
[%expect {| false |}]
|