summaryrefslogtreecommitdiff
path: root/examples/scala-js/test-suite/src/test/scala/scala/scalajs/testsuite/compiler/ReflectionTest.scala
blob: 3e1d7a2e9d9080299683387cddc27a65ee7e1ede (plain) (blame)
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
/*                     __                                               *\
**     ________ ___   / /  ___      __ ____  Scala.js Test Suite        **
**    / __/ __// _ | / /  / _ | __ / // __/  (c) 2013, LAMP/EPFL        **
**  __\ \/ /__/ __ |/ /__/ __ |/_// /_\ \    http://scala-js.org/       **
** /____/\___/_/ |_/____/_/ | |__/ /____/                               **
**                          |/____/                                     **
\*                                                                      */
package scala.scalajs.testsuite.compiler

import scala.language.implicitConversions

import scala.scalajs.js

import org.scalajs.jasminetest.JasmineTest

/** Tests the little reflection we support */
object ReflectionTest extends JasmineTest {

  describe("Scala.js Reflection (through java.lang.Class)") {
    it("should append $ to class name of objects") {
      expect(TestObject.getClass.getName).toEqual(
        "scala.scalajs.testsuite.compiler.ReflectionTest$TestObject$")
    }

    it("should support isInstance") {
      class A
      class B extends A
      val b = new B
      expect(classOf[A].isInstance(b)).toBeTruthy
      expect(classOf[A].isInstance("hello")).toBeFalsy
    }

    it("getClass() for normal types") {
      class Foo {
        def bar() = super.getClass()
      }
      val foo = new Foo
      expect(foo.getClass() eq classOf[Foo]).toBeTruthy
      expect(foo.bar() eq classOf[Foo]).toBeTruthy
    }

    it("getClass() for anti-boxed primitive types") {
      implicit def classAsAny(c: java.lang.Class[_]): js.Any =
        c.asInstanceOf[js.Any]
      expect((false: Any).getClass).toBe(classOf[java.lang.Boolean])
      expect(('a': Any).getClass).toBe(classOf[java.lang.Character])
      expect((1.toByte: Any).getClass).toBe(classOf[java.lang.Byte])
      expect((1.toShort: Any).getClass).toBe(classOf[java.lang.Byte])
      expect((1: Any).getClass).toBe(classOf[java.lang.Byte])
      expect((1L: Any).getClass).toBe(classOf[java.lang.Long])
      expect((1.5f: Any).getClass).toBe(classOf[java.lang.Float])
      expect((1.5: Any).getClass).toBe(classOf[java.lang.Float])
      expect(((): Any).getClass).toBe(classOf[scala.runtime.BoxedUnit])
    }

    it("Class.isAssignableFrom should mimic runtime type tests behavior - #879") {
      expect(classOf[Short].isAssignableFrom(classOf[Byte])).toBeTruthy
      expect(classOf[Byte].isAssignableFrom(classOf[Byte])).toBeTruthy
      expect(classOf[Byte].isAssignableFrom(classOf[Short])).toBeFalsy
      expect(classOf[Int].isAssignableFrom(classOf[Byte])).toBeTruthy
      expect(classOf[Double].isAssignableFrom(classOf[Int])).toBeTruthy
      expect(classOf[Int].isAssignableFrom(classOf[Double])).toBeFalsy
      expect(classOf[Long].isAssignableFrom(classOf[Int])).toBeFalsy
    }
  }

  object TestObject

}