aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorFelix Mulder <felix.mulder@gmail.com>2017-04-11 12:01:17 +0200
committerGitHub <noreply@github.com>2017-04-11 12:01:17 +0200
commit4868fb29580a67c7a1560d5c1c7cc658e2634359 (patch)
tree1deed7fb92912f09b810e905e351fe4cd796cc6b /tests
parent579571e05a08120133173933e7eaf2555846d1d7 (diff)
parent198b5cec531a8e0d6c121cc425e19a54b7818868 (diff)
downloaddotty-4868fb29580a67c7a1560d5c1c7cc658e2634359.tar.gz
dotty-4868fb29580a67c7a1560d5c1c7cc658e2634359.tar.bz2
dotty-4868fb29580a67c7a1560d5c1c7cc658e2634359.zip
Merge pull request #1938 from dotty-staging/named-based-patmat
Change case class desugaring and decouple Products and name-based-pattern-matching
Diffstat (limited to 'tests')
-rw-r--r--tests/pos/t7296.scala (renamed from tests/pending/pos/t7296.scala)0
-rw-r--r--tests/run/1938.scala45
-rw-r--r--tests/run/case-class-23.check (renamed from tests/pending/run/case-class-23.check)0
-rw-r--r--tests/run/case-class-23.scala (renamed from tests/pending/run/case-class-23.scala)0
-rw-r--r--tests/run/double-pattern-type.scala40
-rw-r--r--tests/run/zero-arity-case-class.scala26
6 files changed, 111 insertions, 0 deletions
diff --git a/tests/pending/pos/t7296.scala b/tests/pos/t7296.scala
index fcba17c08..fcba17c08 100644
--- a/tests/pending/pos/t7296.scala
+++ b/tests/pos/t7296.scala
diff --git a/tests/run/1938.scala b/tests/run/1938.scala
new file mode 100644
index 000000000..95e94678d
--- /dev/null
+++ b/tests/run/1938.scala
@@ -0,0 +1,45 @@
+case class Large(
+ e1: Int,
+ e2: Int,
+ e3: Int,
+ e4: Int,
+ e5: Int,
+ e6: Int,
+ e7: Int,
+ e8: Int,
+ e9: Int,
+ e10: Int,
+ e11: Int,
+ e12: Int,
+ e13: Int,
+ e14: Int,
+ e15: Int,
+ e16: Int,
+ e17: Int,
+ e18: Int,
+ e19: Int,
+ e20: Int,
+ e21: Int,
+ e22: Int,
+ e23: Int
+)
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ val l = Large(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23)
+
+ assert(l.productArity == 23)
+
+ assert(l.productElement(0) == 1)
+ assert(l.productElement(1) == 2)
+ assert(l.productElement(21) == 22)
+ assert(l.productElement(22) == 23)
+
+ try {
+ l.productElement(23)
+ ???
+ } catch {
+ case e: IndexOutOfBoundsException => assert(e.getMessage == "23")
+ }
+ }
+}
diff --git a/tests/pending/run/case-class-23.check b/tests/run/case-class-23.check
index 888ed2c9e..888ed2c9e 100644
--- a/tests/pending/run/case-class-23.check
+++ b/tests/run/case-class-23.check
diff --git a/tests/pending/run/case-class-23.scala b/tests/run/case-class-23.scala
index a6d78763c..a6d78763c 100644
--- a/tests/pending/run/case-class-23.scala
+++ b/tests/run/case-class-23.scala
diff --git a/tests/run/double-pattern-type.scala b/tests/run/double-pattern-type.scala
new file mode 100644
index 000000000..8045d173b
--- /dev/null
+++ b/tests/run/double-pattern-type.scala
@@ -0,0 +1,40 @@
+case class C1(i: String, s: Int) { def isEmpty = false; def get = ("EMPTY", -1) }
+case class C2(i: String, s: String) { def isEmpty = false; def get = (-1, -2, -3) }
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ // When both Product and name based patterns with same arity are available,
+ // we follow scalac and silently use the Product one:
+
+ val c1 = C1("s", 0)
+ c1 match {
+ case C1(a, b) =>
+ assert(a == "s")
+ assert(b == 0)
+ }
+
+ // When the size differ, both are patterns become usable:
+
+ val c2 = C2("a", "b")
+ c2 match {
+ case C2(a, b) =>
+ assert(a == "a")
+ assert(b == "b")
+ }
+
+ c2 match {
+ case C2(a, b, c) =>
+ assert(a == -1)
+ assert(b == -2)
+ assert(c == -3)
+ }
+
+ // Interestingly things also compile with a single pattern, in which case
+ // the tuple returned by get is binded to `a`:
+
+ c2 match {
+ case C2(a) =>
+ assert(a == (-1, -2, -3))
+ }
+ }
+}
diff --git a/tests/run/zero-arity-case-class.scala b/tests/run/zero-arity-case-class.scala
new file mode 100644
index 000000000..de0ba4fe1
--- /dev/null
+++ b/tests/run/zero-arity-case-class.scala
@@ -0,0 +1,26 @@
+case class Foo()
+
+object Test {
+ def main(args: Array[String]): Unit = {
+ assert(Foo.unapply(Foo()) == true)
+
+ // unapply generate by scalac are `_ != null`,
+ // dotty returns true in all cases
+ assert(Foo.unapply(null) == true)
+
+ Foo() match {
+ case Foo() => ()
+ case _ => ???
+ }
+
+ Foo() match {
+ case _: Foo => ()
+ case _ => ???
+ }
+
+ (Foo(): Any) match {
+ case Foo() => ()
+ case _ => ???
+ }
+ }
+}