summaryrefslogtreecommitdiff
path: root/examples/scala-js/compiler/src/test/scala/scala/scalajs/compiler/test/JSInteropTest.scala
diff options
context:
space:
mode:
authorHaoyi Li <haoyi@haoyi-mbp.corp.dropbox.com>2014-11-26 00:45:31 -0800
committerHaoyi Li <haoyi@haoyi-mbp.corp.dropbox.com>2014-11-26 00:45:31 -0800
commit24f31e120f9537faede7a174bb09ee35f64e1ce4 (patch)
tree06ffc3ecc7847789008352b7e2b7c040dad48907 /examples/scala-js/compiler/src/test/scala/scala/scalajs/compiler/test/JSInteropTest.scala
parentb89ce9cbf79363f8cab09186a5d7ba94bc0af02a (diff)
parent2c4b142503bd2d871e6818b5cab8c38627d9e4a0 (diff)
downloadhands-on-scala-js-24f31e120f9537faede7a174bb09ee35f64e1ce4.tar.gz
hands-on-scala-js-24f31e120f9537faede7a174bb09ee35f64e1ce4.tar.bz2
hands-on-scala-js-24f31e120f9537faede7a174bb09ee35f64e1ce4.zip
Merge commit '2c4b142503bd2d871e6818b5cab8c38627d9e4a0' as 'examples/scala-js'
Diffstat (limited to 'examples/scala-js/compiler/src/test/scala/scala/scalajs/compiler/test/JSInteropTest.scala')
-rw-r--r--examples/scala-js/compiler/src/test/scala/scala/scalajs/compiler/test/JSInteropTest.scala350
1 files changed, 350 insertions, 0 deletions
diff --git a/examples/scala-js/compiler/src/test/scala/scala/scalajs/compiler/test/JSInteropTest.scala b/examples/scala-js/compiler/src/test/scala/scala/scalajs/compiler/test/JSInteropTest.scala
new file mode 100644
index 0000000..99c274f
--- /dev/null
+++ b/examples/scala-js/compiler/src/test/scala/scala/scalajs/compiler/test/JSInteropTest.scala
@@ -0,0 +1,350 @@
+package scala.scalajs.compiler.test
+
+import scala.scalajs.compiler.test.util._
+
+import org.junit.Test
+import org.junit.Ignore
+
+class JSInteropTest extends DirectTest with TestHelpers {
+
+ override def preamble =
+ """import scala.scalajs.js
+ """
+
+ @Test
+ def noInnerClassTraitObject: Unit = {
+
+ val objs = List("class", "trait", "object")
+
+ for {
+ outer <- objs
+ inner <- objs
+ } yield {
+ s"""
+ $outer A extends js.Object {
+ $inner A
+ }
+ """ hasErrors
+ s"""
+ |newSource1.scala:4: error: Traits, classes and objects extending js.Any may not have inner traits, classes or objects
+ | $inner A
+ | ${" " * inner.length}^
+ """
+ }
+
+ }
+
+ @Test
+ def noBadSetters = {
+
+ """
+ class A extends js.Object {
+ def foo_=(x: Int): Int = js.native
+ }
+ """ hasErrors
+ """
+ |newSource1.scala:4: error: Setters that do not return Unit are not allowed in types extending js.Any
+ | def foo_=(x: Int): Int = js.native
+ | ^
+ """
+
+ }
+
+ @Test
+ def onlyJSRawTraits = {
+
+ """
+ trait A
+ class B extends js.Object with A
+ """ hasErrors
+ """
+ |newSource1.scala:4: error: B extends A which does not extend js.Any.
+ | class B extends js.Object with A
+ | ^
+ """
+
+ """
+ trait A
+ class B extends js.Object with Serializable
+ """ hasErrors
+ """
+ |newSource1.scala:4: error: B extends scala.Serializable which does not extend js.Any.
+ | class B extends js.Object with Serializable
+ | ^
+ """
+
+ }
+
+ @Test
+ def noAnonymousClass = {
+
+ """
+ class A {
+ val x = new js.Object {
+ def a: Int = js.native
+ }
+ }
+ """ hasErrors
+ """
+ |newSource1.scala:4: error: Anonymous classes may not extend js.Any
+ | val x = new js.Object {
+ | ^
+ """
+
+ }
+
+ @Test
+ def noCaseClassObject = {
+
+ """
+ case class A(x: Int) extends js.Object
+ """ hasErrors
+ """
+ |newSource1.scala:3: error: Classes and objects extending js.Any may not have a case modifier
+ | case class A(x: Int) extends js.Object
+ | ^
+ """
+
+ """
+ case object B extends js.Object
+ """ hasErrors
+ """
+ |newSource1.scala:3: error: Classes and objects extending js.Any may not have a case modifier
+ | case object B extends js.Object
+ | ^
+ """
+
+ }
+
+ @Test
+ def notNested: Unit = {
+
+ val outers = List("class", "trait")
+ val inners = List("trait", "class", "object")
+
+ for {
+ outer <- outers
+ inner <- inners
+ } yield {
+
+ val errTrg = if (inner == "object") "Objects" else "Classes"
+
+ s"""
+ $outer A {
+ $inner Inner extends js.Object
+ }
+ """ hasErrors
+ s"""
+ |newSource1.scala:4: error: $errTrg extending js.Any may not be defined inside a class or trait
+ | $inner Inner extends js.Object
+ | ${" " * inner.length}^
+ """
+ }
+
+ }
+
+ @Test
+ def noGlobalScopeClass = {
+
+ """
+ class A extends js.GlobalScope
+ """ hasErrors
+ """
+ |newSource1.scala:3: error: Only objects may extend js.GlobalScope
+ | class A extends js.GlobalScope
+ | ^
+ """
+
+ """
+ trait A extends js.GlobalScope
+ """ hasErrors
+ """
+ |newSource1.scala:3: error: Only objects may extend js.GlobalScope
+ | trait A extends js.GlobalScope
+ | ^
+ """
+
+ }
+
+ @Test
+ def noLocalClass = {
+
+ """
+ object A {
+ def a = {
+ class B extends js.Object
+ }
+ }
+ """ hasErrors
+ """
+ |newSource1.scala:5: error: Local classes and objects may not extend js.Any
+ | class B extends js.Object
+ | ^
+ """
+
+ }
+
+ @Test
+ def noLocalObject = {
+
+ """
+ object A {
+ def a = {
+ object B extends js.Object
+ }
+ }
+ """ hasErrors
+ """
+ |newSource1.scala:5: error: Local classes and objects may not extend js.Any
+ | object B extends js.Object
+ | ^
+ """
+
+ }
+
+ @Test
+ def noExtendJSAny = {
+
+ """
+ class A extends js.Any
+ """ hasErrors
+ """
+ |newSource1.scala:3: error: illegal inheritance from sealed trait Any
+ | class A extends js.Any
+ | ^
+ """
+
+ }
+
+ @Test
+ def noNativeInJSAny = {
+
+ """
+ class A extends js.Object {
+ @native
+ def value: Int = js.native
+ }
+ """ hasErrors
+ """
+ |newSource1.scala:5: error: Methods in a js.Any may not be @native
+ | def value: Int = js.native
+ | ^
+ """
+
+ }
+
+ @Test
+ def warnJSAnyBody = {
+
+ """
+ class A extends js.Object {
+ def value: Int = ???
+ val x: Int = ???
+ }
+ """ hasWarns
+ """
+ |newSource1.scala:4: warning: Members of traits, classes and objects extending js.Any may only contain members that call js.native. This will be enforced in 1.0.
+ | def value: Int = ???
+ | ^
+ |newSource1.scala:5: warning: Members of traits, classes and objects extending js.Any may only contain members that call js.native. This will be enforced in 1.0.
+ | val x: Int = ???
+ | ^
+ """
+
+ """
+ trait A extends js.Object {
+ def value: Int
+ val x: Int
+ }
+ """ hasWarns
+ """
+ |newSource1.scala:4: warning: Members of traits, classes and objects extending js.Any may only contain members that call js.native. This will be enforced in 1.0.
+ | def value: Int
+ | ^
+ |newSource1.scala:5: warning: Members of traits, classes and objects extending js.Any may only contain members that call js.native. This will be enforced in 1.0.
+ | val x: Int
+ | ^
+ """
+
+ }
+
+ @Test
+ def noCallSecondaryCtor = {
+
+ """
+ class A(x: Int, y: Int) extends js.Object {
+ def this(x: Int) = this(x, 5)
+ def this() = this(7)
+ }
+ """ hasErrors
+ """
+ |newSource1.scala:5: error: A secondary constructor of a class extending js.Any may only call the primary constructor
+ | def this() = this(7)
+ | ^
+ """
+
+ }
+
+ @Test
+ def noUseJsNative = {
+
+ """
+ class A {
+ def foo = js.native
+ }
+ """ hasErrors
+ """
+ |newSource1.scala:4: error: js.native may only be used as stub implementation in facade types
+ | def foo = js.native
+ | ^
+ """
+
+ }
+
+ @Test
+ def warnNothingRaw = {
+
+ """
+ class A extends js.Object {
+ def foo = js.native
+ val bar = js.native
+ }
+ """ hasWarns
+ """
+ |newSource1.scala:4: warning: The type of foo got inferred as Nothing. To suppress this warning, explicitly ascribe the type.
+ | def foo = js.native
+ | ^
+ |newSource1.scala:5: warning: The type of bar got inferred as Nothing. To suppress this warning, explicitly ascribe the type.
+ | val bar = js.native
+ | ^
+ """
+
+ }
+
+ @Test
+ def noNonLiteralJSName = {
+
+ """
+ import js.annotation.JSName
+
+ object A {
+ val a = "Hello"
+ final val b = "World"
+ }
+
+ class B extends js.Object {
+ @JSName(A.a)
+ def foo: Int = js.native
+ @JSName(A.b)
+ def bar: Int = js.native
+ }
+ """ hasErrors
+ """
+ |newSource1.scala:11: error: The argument to JSName must be a literal string
+ | @JSName(A.a)
+ | ^
+ """
+
+ }
+
+}