summaryrefslogtreecommitdiff
path: root/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/jsinterop/ExportsTest.scala
diff options
context:
space:
mode:
Diffstat (limited to 'examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/jsinterop/ExportsTest.scala')
-rw-r--r--examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/jsinterop/ExportsTest.scala1075
1 files changed, 0 insertions, 1075 deletions
diff --git a/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/jsinterop/ExportsTest.scala b/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/jsinterop/ExportsTest.scala
deleted file mode 100644
index d577d8d..0000000
--- a/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/jsinterop/ExportsTest.scala
+++ /dev/null
@@ -1,1075 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ __ ____ Scala.js Test Suite **
-** / __/ __// _ | / / / _ | __ / // __/ (c) 2013, LAMP/EPFL **
-** __\ \/ /__/ __ |/ /__/ __ |/_// /_\ \ http://scala-js.org/ **
-** /____/\___/_/ |_/____/_/ | |__/ /____/ **
-** |/____/ **
-\* */
-package scala.scalajs.testsuite.jsinterop
-
-import scala.scalajs.js
-import js.annotation._
-import org.scalajs.jasminetest.{JasmineTest, JasmineTestFramework}
-
-import scala.annotation.meta
-
-object ExportsTest extends JasmineTest {
-
- /** This package in the JS (export) namespace */
- val jsPackage = js.Dynamic.global.scala.scalajs.testsuite.jsinterop
-
- describe("@JSExport") {
-
- it("should offer exports for methods with implicit name") {
- class Foo {
- @JSExport
- def bar(): Int = 42
- @JSExport
- def double(x: Int): Int = x*2
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(js.typeOf(foo.bar)).toBe("function")
- expect(foo.bar()).toEqual(42)
- expect(foo.double(3)).toEqual(6)
- }
-
- it("should offer exports for methods with explicit name") {
- class Foo {
- @JSExport("theAnswer")
- def bar(): Int = 42
- @JSExport("doubleTheParam")
- def double(x: Int): Int = x*2
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(foo.bar).toBeUndefined
- expect(js.typeOf(foo.theAnswer)).toBe("function")
- expect(foo.theAnswer()).toEqual(42)
- expect(foo.doubleTheParam(3)).toEqual(6)
- }
-
- it("should offer exports for methods with constant folded name") {
- class Foo {
- @JSExport(ExportNameHolder.methodName)
- def bar(): Int = 42
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(foo.bar).toBeUndefined
- expect(foo.myMethod()).toEqual(42)
- }
-
- it("should offer exports for protected methods") {
- class Foo {
- @JSExport
- protected def bar(): Int = 42
-
- @JSExport
- protected[testsuite] def foo(): Int = 100
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(js.typeOf(foo.bar)).toBe("function")
- expect(foo.bar()).toEqual(42)
- expect(js.typeOf(foo.foo)).toBe("function")
- expect(foo.foo()).toEqual(100)
- }
-
- it("should offer exports for properties with implicit name") {
- class Foo {
- private[this] var myY: String = "hello"
- @JSExport
- val answer: Int = 42
- @JSExport
- var x: Int = 3
- @JSExport
- def doubleX: Int = x*2
- @JSExport
- def y: String = myY + " get"
- @JSExport
- def y_=(v: String): Unit = myY = v + " set"
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(js.typeOf(foo.answer)).toBe("number")
- expect(foo.answer).toEqual(42)
- expect(foo.x).toEqual(3)
- expect(foo.doubleX).toEqual(6)
- foo.x = 23
- expect(foo.x).toEqual(23)
- expect(foo.doubleX).toEqual(46)
- expect(foo.y).toEqual("hello get")
- foo.y = "world"
- expect(foo.y).toEqual("world set get")
- }
-
- it("should offer exports for properties with explicit name") {
- class Foo {
- private[this] var myY: String = "hello"
- @JSExport("answer")
- val answerScala: Int = 42
- @JSExport("x")
- var xScala: Int = 3
- @JSExport("doubleX")
- def doubleXScala: Int = xScala*2
- @JSExport("y")
- def yGetter: String = myY + " get"
- @JSExport("y")
- def ySetter_=(v: String): Unit = myY = v + " set"
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(foo.answerScala).toBeUndefined
- expect(js.typeOf(foo.answer)).toBe("number")
- expect(foo.answer).toEqual(42)
- expect(foo.x).toEqual(3)
- expect(foo.doubleX).toEqual(6)
- foo.x = 23
- expect(foo.x).toEqual(23)
- expect(foo.doubleX).toEqual(46)
- expect(foo.y).toEqual("hello get")
- foo.y = "world"
- expect(foo.y).toEqual("world set get")
- }
-
- it("should offer exports for protected properties") {
- class Foo {
- @JSExport
- protected val x: Int = 42
- @JSExport
- protected[testsuite] val y: Int = 43
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(foo.x).toEqual(42)
- expect(foo.y).toEqual(43)
- }
-
- it("should offer overloaded exports for methods") {
- class Foo {
- @JSExport("foobar")
- def foo(): Int = 42
- @JSExport("foobar")
- def bar(x: Int): Int = x*2
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(js.typeOf(foo.foobar)).toBe("function")
- expect(foo.foobar()).toEqual(42)
- expect(foo.foobar(3)).toEqual(6)
- }
-
- it("should offer multiple exports for the same method") {
- class Foo {
- @JSExport
- @JSExport("b")
- @JSExport("c")
- def a(): Int = 1
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(js.typeOf(foo.a)).toBe("function")
- expect(js.typeOf(foo.b)).toBe("function")
- expect(js.typeOf(foo.c)).toBe("function")
-
- expect(foo.a()).toEqual(1)
- expect(foo.b()).toEqual(1)
- expect(foo.c()).toEqual(1)
- }
-
- it("should inherit exports from traits") {
- trait Foo {
- @JSExport
- def x: Int
-
- @JSExport
- def method(x: Int): Int
- }
-
- class Bar extends Foo {
- val x = 1
- def method(x: Int) = 2 * x
- }
-
- val bar = (new Bar).asInstanceOf[js.Dynamic]
- expect(bar.x).toEqual(1)
- expect(js.typeOf(bar.method)).toBe("function")
- expect(bar.method(2)).toEqual(4)
- }
-
- it("should offer overloading with inherited exports") {
- class A {
- @JSExport
- def foo(x: Int) = 2*x
- }
-
- class B extends A{
- @JSExport("foo")
- def bar(x: String) = s"Hello $x"
- }
-
- val b = (new B).asInstanceOf[js.Dynamic]
- expect(js.typeOf(b.foo)).toBe("function")
- expect(b.foo(1)).toEqual(2)
- expect(b.foo("World")).toEqual("Hello World")
- }
-
- it("should offer exports for generic methods") {
- class Foo {
- @JSExport
- def gen[T <: AnyRef](x: T) = x
- }
-
- val x = (new Object).asInstanceOf[js.Any]
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(js.typeOf(foo.gen)).toBe("function")
- expect(foo.gen(x)).toBe(x)
- }
-
- it("should offer exports for lambda return types") {
- class Foo {
- @JSExport
- def lambda(x: Int) = (y: Int) => x + y
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(js.typeOf(foo.lambda)).toBe("function")
-
- val lambda = foo.lambda(5).asInstanceOf[Function1[Int,Int]]
-
- expect(lambda(4)).toEqual(9)
- }
-
- it("should offer exports for multi parameter lists") {
- class Foo {
- @JSExport
- def multiParam(x: Int)(y: Int): Int = x + y
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(js.typeOf(foo.multiParam)).toBe("function")
- expect(foo.multiParam(5,6)).toEqual(11)
- }
-
- it("should offer exports for default arguments") {
- class Foo {
- @JSExport
- def defArg(x: Int = 1) = x
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(js.typeOf(foo.defArg)).toBe("function")
- expect(foo.defArg(5)).toEqual(5)
- }
-
- it("should offer exports for weird stuff") {
- class UhOh {
- // Something no one should export
- @JSExport
- def ahem[T : Comparable](x: T)(implicit y: Int) = ???
- }
-
- val x = (new UhOh).asInstanceOf[js.Dynamic]
- expect(js.typeOf(x.ahem)).toBe("function")
- }
-
- it("should offer exports with value class return types") {
- class Foo {
- @JSExport
- def vc(x: Int) = new SomeValueClass(x)
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(js.typeOf(foo.vc)).toBe("function")
-
- // The result should be a boxed SomeValueClass
- val result = foo.vc(5)
- expect(js.typeOf(result)).toEqual("object")
- expect((result: Any).isInstanceOf[SomeValueClass]).toBeTruthy
- expect((result: Any) == (new SomeValueClass(5))).toBeTruthy
- }
-
- it("should allow exports with Any as return type") {
- class A
- class Foo {
- @JSExport
- def foo(switch: Boolean): Any =
- if (switch) 1 else new A
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(foo.foo(true).isInstanceOf[Int]).toBeTruthy
- expect(foo.foo(false).isInstanceOf[A]).toBeTruthy
- }
-
- it("should accept boxed value classes as parameter") {
- class Foo {
- @JSExport
- def vc(x: SomeValueClass) = x.i
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(js.typeOf(foo.vc)).toBe("function")
-
- // The parameter should be a boxed SomeValueClass
- val valueCls = new SomeValueClass(7)
- val result = foo.vc(valueCls.asInstanceOf[js.Any])
- expect(js.typeOf(result)).toEqual("number")
- expect(result).toEqual(7)
- }
-
- it("should offer exports for overridden methods with refined return type") {
- class A
- class B extends A
-
- class C1 {
- @JSExport
- def x: A = new A
- }
-
- class C2 extends C1 {
- override def x: B = new B
- }
-
- val c2 = (new C2).asInstanceOf[js.Dynamic]
- expect(c2.x.isInstanceOf[B]).toBeTruthy
- }
-
- it("should offer exports for methods with refined types as return type") {
- class A {
- @JSExport
- def foo(x: String): js.Object with js.Dynamic =
- js.Dynamic.literal(arg = x)
- }
-
- val a = (new A).asInstanceOf[js.Dynamic]
- expect(a.foo("hello")).toEqual(js.Dynamic.literal(arg = "hello"))
- }
-
- it("should offer exports for variable argument methods - #393") {
- class A {
- @JSExport
- def foo(i: String*) = i.mkString("|")
- }
-
- val a = (new A).asInstanceOf[js.Dynamic]
-
- expect(a.foo()).toEqual("")
- expect(a.foo("a", "b", "c")).toEqual("a|b|c")
- expect(a.foo("a", "b", "c", "d")).toEqual("a|b|c|d")
- }
-
- it("should correctly overload in view of difficult repeated parameter lists") {
- class A {
- @JSExport
- def foo(a: String, b: String, i: Int, c: String) = 1
-
- @JSExport
- def foo(a: String*) = 2
-
- @JSExport
- def foo(x: Int)(a: Int*) = x * 100000 + a.sum
- }
-
- val a = (new A).asInstanceOf[js.Dynamic]
-
- expect(a.foo()).toEqual(2)
- expect(a.foo("asdf")).toEqual(2)
- expect(a.foo("asdf", "foo")).toEqual(2)
- expect(a.foo("asdf", "foo", "bar")).toEqual(2)
- expect(a.foo("asdf", "foo", 1, "bar")).toEqual(1)
- expect(a.foo("asdf", "foo", "foo", "bar")).toEqual(2)
- expect(a.foo(5, 1, 2, 3, 10)).toEqual(500016)
- expect(a.foo(1)).toEqual(100000)
- }
-
- it("should offer exports with default arguments") {
- class A {
- var oneCount: Int = 0
- def one = {
- oneCount += 1
- 1
- }
- @JSExport
- def foo(a: Int = one)(b: Int = a + one)(c: Int = b + one) =
- a + b + c
- }
-
- val a = new A
- val jsa = a.asInstanceOf[js.Dynamic]
-
- expect(jsa.foo()).toEqual(6)
- expect(a.oneCount).toEqual(3)
-
- expect(jsa.foo(2)).toEqual(9)
- expect(a.oneCount).toEqual(5)
-
- expect(jsa.foo(2,4)).toEqual(11)
- expect(a.oneCount).toEqual(6)
-
- expect(jsa.foo(2,4,10)).toEqual(16)
- expect(a.oneCount).toEqual(6)
-
- expect(jsa.foo((),4,10)).toEqual(15)
- expect(a.oneCount).toEqual(7)
-
- expect(jsa.foo((),4)).toEqual(10)
- expect(a.oneCount).toEqual(9)
- }
-
- it("should correctly overload methods in presence of default parameters") {
- class A {
- @JSExport
- def foo(a: Int)(b: Int = 5)(c: Int = 7) = 1000 + a + b + c
-
- @JSExport
- def foo(a: Int, b: String) = 2
-
- @JSExport
- def foo(a: Int, b: Int, c: String) = 3
- }
-
- val a = (new A).asInstanceOf[js.Dynamic]
-
- expect(a.foo(1)).toEqual(1013)
- expect(a.foo(1, 4)).toEqual(1012)
- expect(a.foo(1, 4, 5)).toEqual(1010)
- expect(a.foo(1, "foo")).toEqual(2)
- expect(a.foo(1, 2, "foo")).toEqual(3)
-
- }
-
- it("should prefer overloads taking a js.Undefined over methods with default parameters") {
- class A {
- @JSExport
- def foo(a: Int)(b: String = "asdf") = s"$a $b"
-
- @JSExport
- def foo(a: Int, b: js.prim.Undefined) = "woot"
- }
-
- val a = (new A).asInstanceOf[js.Dynamic]
-
- expect(a.foo(1)).toEqual("1 asdf")
- expect(a.foo(2, "omg")).toEqual("2 omg")
- expect(a.foo(1, ())).toEqual("woot")
-
- }
-
- it("should correctly overload methods in presence of default parameters and repeated parameters") {
- class A {
- @JSExport
- def foo(x: Int, y: Int = 1) = x + y
- @JSExport
- def foo(x: String*) = x.mkString("|")
- }
-
- val a = (new A).asInstanceOf[js.Dynamic]
-
- expect(a.foo(1)).toEqual(2)
- expect(a.foo(1, 2)).toEqual(3)
- expect(a.foo()).toEqual("")
- expect(a.foo("foo")).toEqual("foo")
- expect(a.foo("foo","bar")).toEqual("foo|bar")
-
- }
-
- it("should correctly overload exports called `toString`") {
- class A {
- override def toString(): String = "no arg"
- @JSExport
- def toString(x: Int): String = s"with arg: $x"
- }
-
- val a = (new A).asInstanceOf[js.Dynamic]
- expect(a.applyDynamic("toString")()).toEqual("no arg")
- expect(a.applyDynamic("toString")(1)).toEqual("with arg: 1")
- }
-
- it("should allow to explicitly export toString") {
- class A {
- @JSExport("toString")
- override def toString(): String = "called"
- }
-
- val a = (new A).asInstanceOf[js.Dynamic]
- expect(a.applyDynamic("toString")()).toEqual("called")
- }
-
- it("should correctly box repeated parameter lists with value classes") {
- class A {
- @JSExport
- def foo(vcs: SomeValueClass*) = vcs.map(_.i).sum
- }
-
- val vc1 = new SomeValueClass(1)
- val vc2 = new SomeValueClass(2)
- val a = (new A).asInstanceOf[js.Dynamic]
-
- expect(a.foo(vc1.asInstanceOf[js.Any], vc2.asInstanceOf[js.Any])).toEqual(3)
- }
-
- it("should offer exports for objects with implicit name") {
- val accessor = jsPackage.ExportedObject
- expect(accessor).toBeDefined
- expect(js.typeOf(accessor)).toEqual("function")
- val obj = accessor()
- expect(obj).toBeDefined
- expect(js.typeOf(obj)).toEqual("object")
- expect(obj.witness).toEqual("witness")
- }
-
- it("should offer exports for objects with explicit name") {
- val accessor = js.Dynamic.global.TheExportedObject
- expect(accessor).toBeDefined
- expect(js.typeOf(accessor)).toEqual("function")
- val obj = accessor()
- expect(obj).toBeDefined
- expect(js.typeOf(obj)).toEqual("object")
- expect(obj.witness).toEqual("witness")
- }
-
- it("should offer exports for objects with qualified name") {
- val accessor = js.Dynamic.global.qualified.testobject.ExportedObject
- expect(accessor).toBeDefined
- expect(js.typeOf(accessor)).toEqual("function")
- val obj = accessor()
- expect(obj).toBeDefined
- expect(js.typeOf(obj)).toEqual("object")
- expect(obj.witness).toEqual("witness")
- }
-
- it("should offer exports for objects with constant folded name") {
- val accessor = js.Dynamic.global.ConstantFoldedObjectExport
- expect(accessor).toBeDefined
- expect(js.typeOf(accessor)).toEqual("function")
- val obj = accessor()
- expect(obj).toBeDefined
- expect(js.typeOf(obj)).toEqual("object")
- expect(obj.witness).toEqual("witness")
- }
-
- it("should offer exports for protected objects") {
- val accessor = jsPackage.ProtectedExportedObject
- expect(accessor).toBeDefined
- expect(js.typeOf(accessor)).toEqual("function")
- val obj = accessor()
- expect(obj).toBeDefined
- expect(js.typeOf(obj)).toEqual("object")
- expect(obj.witness).toEqual("witness")
- }
-
- it("should offer exports for classes with implicit name") {
- val constr = jsPackage.ExportedClass
- expect(constr).toBeDefined
- expect(js.typeOf(constr)).toEqual("function")
- val obj = js.Dynamic.newInstance(constr)(5)
- expect(obj.x).toEqual(5)
- }
-
- it("should offer exports for classes with explicit name") {
- val constr = js.Dynamic.global.TheExportedClass
- expect(constr).toBeDefined
- expect(js.typeOf(constr)).toEqual("function")
- val obj = js.Dynamic.newInstance(constr)(5)
- expect(obj.x).toEqual(5)
- }
-
- it("should offer exports for classes with qualified name") {
- val constr = js.Dynamic.global.qualified.testclass.ExportedClass
- expect(constr).toBeDefined
- expect(js.typeOf(constr)).toEqual("function")
- val obj = js.Dynamic.newInstance(constr)(5)
- expect(obj.x).toEqual(5)
- }
-
- it("should offer exports for classes with constant folded name") {
- val constr = js.Dynamic.global.ConstantFoldedClassExport
- expect(constr).toBeDefined
- expect(js.typeOf(constr)).toEqual("function")
- val obj = js.Dynamic.newInstance(constr)(5)
- expect(obj.x).toEqual(5)
- }
-
- it("should offer exports for protected classes") {
- val constr = jsPackage.ProtectedExportedClass
- expect(constr).toBeDefined
- expect(js.typeOf(constr)).toEqual("function")
- val obj = js.Dynamic.newInstance(constr)(5)
- expect(obj.x).toEqual(5)
- }
-
- it("should offer export for classes with repeated parameters in ctor") {
- val constr = jsPackage.ExportedVarArgClass
- expect(js.Dynamic.newInstance(constr)().result).toEqual("")
- expect(js.Dynamic.newInstance(constr)("a").result).toEqual("a")
- expect(js.Dynamic.newInstance(constr)("a", "b").result).toEqual("a|b")
- expect(js.Dynamic.newInstance(constr)("a", "b", "c").result).toEqual("a|b|c")
- expect(js.Dynamic.newInstance(constr)(5, "a").result).toEqual("Number: <5>|a")
- }
-
- it("should offer export for classes with default parameters in ctor") {
- val constr = jsPackage.ExportedDefaultArgClass
- expect(js.Dynamic.newInstance(constr)(1,2,3).result).toEqual(6)
- expect(js.Dynamic.newInstance(constr)(1).result).toEqual(106)
- expect(js.Dynamic.newInstance(constr)(1,2).result).toEqual(103)
- }
-
- it("should correctly disambiguate overloads involving longs") {
-
- class Foo {
- @JSExport
- def foo(x: Int) = 1
- @JSExport
- def foo(x: Long) = 2
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
-
- // Create a long factory we can call dynamically to retrieve an unboxed
- // long which is typed as a js.Any
- object LongFactory {
- @JSExport
- def aLong = 1L
- }
- val trueJsLong = LongFactory.asInstanceOf[js.Dynamic].aLong
-
- expect(foo.foo(1)).toEqual(1)
- expect(foo.foo(trueJsLong)).toEqual(2)
- }
-
- it("should return boxed Chars") {
- class Foo {
- @JSExport
- def bar(x: Int): Char = x.toChar
- }
- val foo = (new Foo).asInstanceOf[js.Dynamic]
-
- val funs = js.eval("""
- var funs = {
- testIsChar: function(foo) { return JSUtils().isChar(foo.bar(65)); },
- testCharValue: function(foo) { return JSUtils().charToString(foo.bar(65)); }
- }; funs;
- """).asInstanceOf[js.Dynamic]
-
- expect(funs.testIsChar(foo)).toBeTruthy
- expect(funs.testCharValue(foo)).toEqual("A")
- }
-
- it("should take boxed Chars as parameter") {
- class Foo {
- @JSExport
- def bar(x: Char): Int = x.toInt
- }
- val foo = (new Foo).asInstanceOf[js.Dynamic]
-
- val f = js.eval("""
- var f = function(foo) { return foo.bar(JSUtils().stringToChar('e')); };
- f;
- """).asInstanceOf[js.Dynamic]
-
- expect(f(foo)).toEqual('e'.toInt)
- }
-
- it("should be able to disambiguate an Int from a Char") {
- class Foo {
- @JSExport
- def bar(x: Char): String = "char: "+x
- @JSExport
- def bar(x: Int): String = "int: "+x
- }
- val foo = (new Foo).asInstanceOf[js.Dynamic]
-
- val funs = js.eval("""
- var funs = {
- testChar: function(foo) { return foo.bar(JSUtils().stringToChar('S')); },
- testInt: function(foo) { return foo.bar(68); }
- }; funs;
- """).asInstanceOf[js.Dynamic]
-
- expect(funs.testChar(foo)).toEqual("char: S")
- expect(funs.testInt(foo)).toEqual("int: 68")
- }
-
- it("should support exporting constructor parameter fields - #970") {
- class Foo(@(JSExport @meta.field) val x: Int)
- val foo = (new Foo(1)).asInstanceOf[js.Dynamic]
- expect(foo.x).toEqual(1)
- }
-
- it("should support exporting case class fields - #970") {
- case class Foo(@(JSExport @meta.field) x: Int)
- val foo = (new Foo(1)).asInstanceOf[js.Dynamic]
- expect(foo.x).toEqual(1)
- }
-
- it("should support exporting lazy values - #977") {
- class Foo {
- @JSExport
- lazy val x = 1
- }
- val foo = (new Foo).asInstanceOf[js.Dynamic]
- expect(foo.x).toEqual(1)
- }
-
- it("should support exporting all members of a class") {
- @JSExportAll
- class Foo {
- val a = 1
-
- @JSExport // double annotation allowed
- def b = 2
-
- lazy val c = 3
-
- class Bar // not exported, but should not fail
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
-
- expect(foo.a).toEqual(1)
- expect(foo.b).toEqual(2)
- expect(foo.c).toEqual(3)
- }
-
- it("should not export synthetic members with @JSExportAll - #1195") {
- @JSExportAll
- case class Foo(x: Int)
-
- val foo = Foo(1).asInstanceOf[js.Dynamic]
-
- expect(foo.x).toEqual(1)
- expect(foo.copy).toBeUndefined
- }
-
- it("should allow mutliple equivalent JSExport annotations") {
- class Foo {
- @JSExport
- @JSExport("a")
- @JSExport
- @JSExport("a")
- def b = 1
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
-
- expect(foo.b).toEqual(1)
- }
-
- it("should support named exports") {
- import js.Dynamic.{literal => lit}
-
- class FooNamed {
- @JSExportNamed("bar1")
- def bar(x: Int, y: Int) = x + y
-
- @JSExportNamed("bar2")
- @JSExport
- def bar(x: Int = 1)(y: Int = x)(z: Int = y) = x + y + z
- }
-
- val foo = (new FooNamed).asInstanceOf[js.Dynamic]
-
- expect(foo.bar1(lit(x = 1, y = 2))).toEqual(3)
- if (JasmineTestFramework.hasTag("compliant-asinstanceof"))
- expect(() => foo.bar1(lit(x = 1))).toThrow // missing arg
- expect(foo.bar2(lit())).toEqual(3)
- expect(foo.bar2(lit(x = 2))).toEqual(6)
- expect(foo.bar2(lit(y = 2))).toEqual(5)
- expect(foo.bar2(lit(y = 2, z = 1))).toEqual(4)
- expect(foo.bar(2)).toEqual(6)
- expect(foo.bar(2,3)).toEqual(8)
- }
-
- it("should support named constructor exports") {
- import js.Dynamic.{literal => lit}
-
- val constr = jsPackage.ExportedNamedArgClass
- expect(js.Dynamic.newInstance(constr)(lit(x = 2)).result).toEqual("22true")
- expect(js.Dynamic.newInstance(constr)(lit(y = "foo")).result).toEqual("1foofalse")
- expect(js.Dynamic.newInstance(constr)(lit(z = true, y = "foo")).result).toEqual("1footrue")
- }
-
- it("should support exporting under 'org' namespace - #364") {
- val accessor = js.Dynamic.global.org.ExportedUnderOrgObject
- expect(js.typeOf(accessor)).toEqual("function")
- val obj = accessor()
- expect(obj).toBe(ExportedUnderOrgObject.asInstanceOf[js.Any])
- }
-
- when("compliant-asinstanceof").
- it("should reject bad values for arguments of primitive value type") {
- class Foo {
- @JSExport
- def doBool(x: Boolean) = x
- @JSExport
- def doChar(x: Char) = x
- @JSExport
- def doByte(x: Byte) = x
- @JSExport
- def doShort(x: Short) = x
- @JSExport
- def doInt(x: Int) = x
- @JSExport
- def doLong(x: Long) = x
- @JSExport
- def doFloat(x: Float) = x
- @JSExport
- def doDouble(x: Double) = x
- @JSExport
- def doUnit(x: Unit) = x
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
-
- // Nulls
- expect(() => foo.doBool(null)).toThrow
- expect(() => foo.doChar(null)).toThrow
- expect(() => foo.doByte(null)).toThrow
- expect(() => foo.doShort(null)).toThrow
- expect(() => foo.doInt(null)).toThrow
- expect(() => foo.doLong(null)).toThrow
- expect(() => foo.doFloat(null)).toThrow
- expect(() => foo.doDouble(null)).toThrow
- expect(() => foo.doUnit(null)).toThrow
-
- // Class type
- expect(() => foo.doBool(foo)).toThrow
- expect(() => foo.doChar(foo)).toThrow
- expect(() => foo.doByte(foo)).toThrow
- expect(() => foo.doShort(foo)).toThrow
- expect(() => foo.doInt(foo)).toThrow
- expect(() => foo.doLong(foo)).toThrow
- expect(() => foo.doFloat(foo)).toThrow
- expect(() => foo.doDouble(foo)).toThrow
- expect(() => foo.doUnit(foo)).toThrow
-
- // Bad values
- expect(() => foo.doBool(1)).toThrow
- expect(() => foo.doBool("a")).toThrow
-
- expect(() => foo.doChar(1)).toThrow
- expect(() => foo.doChar("a")).toThrow
-
- expect(() => foo.doByte(300)).toThrow
- expect(() => foo.doByte("a")).toThrow
-
- expect(() => foo.doShort(32768)).toThrow
- expect(() => foo.doShort("a")).toThrow
-
- expect(() => foo.doInt(3.2)).toThrow
- expect(() => foo.doInt("a")).toThrow
-
- expect(() => foo.doLong(3.2)).toThrow
- expect(() => foo.doLong(3)).toThrow
- expect(() => foo.doLong("a")).toThrow
-
- expect(() => foo.doFloat("a")).toThrow
- }
-
- when("compliant-asinstanceof").
- it("should reject bad values for arguments of value class type - #613") {
- class Foo {
- @JSExport
- def doVC(x: SomeValueClass) = x
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
-
- expect(() => foo.doVC(null)).toThrow
- expect(() => foo.doVC(foo)).toThrow
- expect(() => foo.doVC(1)).toThrow
- expect(() => foo.doVC("a")).toThrow
- }
-
- when("compliant-asinstanceof").
- it("should reject bad values for arguments of class type") {
- class A
- class B
-
- class Foo {
- @JSExport
- def doA(x: A) = x
- }
-
- val foo = (new Foo).asInstanceOf[js.Dynamic]
-
- expect(() => foo.doA(1)).toThrow
- expect(() => foo.doA((new B).asInstanceOf[js.Any])).toThrow
- expect(() => foo.doA("a")).toThrow
- }
-
- it("should offer exports for classes ending in _= - #1090") {
- val constr = jsPackage.ExportClassSetterNamed_=
- val obj = js.Dynamic.newInstance(constr)()
- expect(obj.x).toBe(1)
- }
-
- it("should offer exports for objects ending in _= - #1090") {
- expect(jsPackage.ExportObjSetterNamed_=().x).toBe(1)
- }
-
- } // describe
-
- describe("@JSExportDescendentObjects") {
-
- it("should offer auto exports for objects extending a trait") {
- val accessor =
- js.Dynamic.global.scala.scalajs.testsuite.jsinterop.AutoExportedTraitObject
- expect(accessor).toBeDefined
- expect(js.typeOf(accessor)).toEqual("function")
- val obj = accessor()
- expect(obj).toBeDefined
- expect(obj).toBe(AutoExportedTraitObject.asInstanceOf[js.Any])
- }
-
- it("should offer auto exports for objects extending a class") {
- val accessor =
- js.Dynamic.global.scala.scalajs.testsuite.jsinterop.AutoExportedClassObject
- expect(accessor).toBeDefined
- expect(js.typeOf(accessor)).toEqual("function")
- val obj = accessor()
- expect(obj).toBeDefined
- expect(obj).toBe(AutoExportedClassObject.asInstanceOf[js.Any])
- }
-
- }
-
- describe("@JSExportDescendentClasses") {
-
- it("should offer auto exports for classes extending a trait") {
- val ctor =
- js.Dynamic.global.scala.scalajs.testsuite.jsinterop.AutoExportedTraitClass
- expect(ctor).toBeDefined
- expect(js.typeOf(ctor)).toEqual("function")
-
- val obj1 = js.Dynamic.newInstance(ctor)()
- expect(obj1).toBeDefined
- expect(obj1.x).toBe(5)
-
- val obj2 = js.Dynamic.newInstance(ctor)(100)
- expect(obj2).toBeDefined
- expect(obj2.x).toBe(100)
- }
-
- it("should offer auto exports for classes extending a class") {
- val ctor =
- js.Dynamic.global.scala.scalajs.testsuite.jsinterop.AutoExportedClassClass
- expect(ctor).toBeDefined
- expect(js.typeOf(ctor)).toEqual("function")
-
- val obj1 = js.Dynamic.newInstance(ctor)()
- expect(obj1).toBeDefined
- expect(obj1.x).toBe(5)
-
- val obj2 = js.Dynamic.newInstance(ctor)(100)
- expect(obj2).toBeDefined
- expect(obj2.x).toBe(100)
- }
-
- }
-
-}
-
-object ExportNameHolder {
- final val className = "ConstantFoldedClassExport"
- final val objectName = "ConstantFoldedObjectExport"
- final val methodName = "myMethod"
-}
-
-@JSExport
-@JSExport("TheExportedObject")
-@JSExport("qualified.testobject.ExportedObject") // purposefully halfway the same as ExportedClass
-@JSExport(ExportNameHolder.objectName)
-object ExportedObject {
- @JSExport
- def witness: String = "witness"
-}
-
-@JSExport
-protected object ProtectedExportedObject {
- @JSExport
- def witness: String = "witness"
-}
-
-@JSExport
-@JSExport("TheExportedClass")
-@JSExport("qualified.testclass.ExportedClass") // purposefully halfway the same as ExportedObject
-@JSExport(ExportNameHolder.className)
-class ExportedClass(_x: Int) {
- @JSExport
- val x = _x
-}
-
-@JSExport
-protected class ProtectedExportedClass(_x: Int) {
- @JSExport
- val x = _x
-}
-
-@JSExport
-class ExportedVarArgClass(x: String*) {
-
- @JSExport
- def this(x: Int, y: String) = this(s"Number: <$x>", y)
-
- @JSExport
- def result = x.mkString("|")
-}
-
-@JSExport
-class ExportedDefaultArgClass(x: Int, y: Int, z: Int) {
-
- @JSExport
- def this(x: Int, y: Int = 5) = this(x, y, 100)
-
- @JSExport
- def result = x + y + z
-}
-
-@JSExport("org.ExportedUnderOrgObject")
-object ExportedUnderOrgObject
-
-@JSExportDescendentClasses
-@JSExportDescendentObjects
-trait AutoExportTrait
-
-object AutoExportedTraitObject extends AutoExportTrait
-class AutoExportedTraitClass(_x: Int) extends AutoExportTrait {
- def this() = this(5)
- @JSExport
- def x: Int = _x
-}
-
-@JSExportDescendentClasses
-@JSExportDescendentObjects
-class AutoExportClass
-
-object AutoExportedClassObject extends AutoExportClass
-class AutoExportedClassClass(_x: Int) extends AutoExportTrait {
- def this() = this(5)
- @JSExport
- def x: Int = _x
-}
-
-class SomeValueClass(val i: Int) extends AnyVal
-
-@JSExportNamed
-class ExportedNamedArgClass(x: Int = 1)(y: String = x.toString)(z: Boolean = y != "foo") {
- @JSExport
- val result = x + y + z
-}
-
-@JSExport
-class ExportClassSetterNamed_= {
- @JSExport
- val x = 1
-}
-
-@JSExport
-object ExportObjSetterNamed_= {
- @JSExport
- val x = 1
-}