diff options
Diffstat (limited to 'test/files')
152 files changed, 1097 insertions, 7917 deletions
diff --git a/test/files/jvm/t8786/B_2.java b/test/files/jvm/t8786/B_2.java index dc155a290f..ab5350b136 100644 --- a/test/files/jvm/t8786/B_2.java +++ b/test/files/jvm/t8786/B_2.java @@ -5,7 +5,7 @@ public class B_2 { public static void m(String a) { res += 100; } public static void m(Object a) { res += 1000; } - public static <T> T foo(int a, T... b) { return b[0]; } + @SafeVarargs public static <T> T foo(int a, T... b) { return b[0]; } public static <T> T bar(T b[]) { return b[0]; } diff --git a/test/files/jvm/varargs/JavaClass.java b/test/files/jvm/varargs/JavaClass.java index 0cc3587c5e..35adcff850 100644 --- a/test/files/jvm/varargs/JavaClass.java +++ b/test/files/jvm/varargs/JavaClass.java @@ -1,5 +1,5 @@ public class JavaClass { - public static <T> void varargz(int i, T... v) { } + @SafeVarargs public static <T> void varargz(int i, T... v) { } public static void callSomeAnnotations() { VaClass va = new VaClass(); diff --git a/test/files/neg/literals.check b/test/files/neg/literals.check index 148a9346c5..79b6d47782 100644 --- a/test/files/neg/literals.check +++ b/test/files/neg/literals.check @@ -19,6 +19,18 @@ literals.scala:23: error: missing integer number literals.scala:27: error: Decimal integer literals may not have a leading zero. (Octal syntax is obsolete.) def tooManyZeros: Int = 00 // line 26: no leading zero ^ +literals.scala:40: error: floating point number too small + def tooTiny: Float = { 0.7e-45f } // floating point number too small + ^ +literals.scala:42: error: double precision floating point number too small + def twoTiny: Double = { 2.0e-324 } // double precision floating point number too small + ^ +literals.scala:44: error: floating point number too large + def tooHuge: Float = { 3.4028236E38f } // floating point number too large + ^ +literals.scala:46: error: double precision floating point number too large + def twoHuge: Double = { 1.7976931348623159e308 } // double precision floating point number too large + ^ literals.scala:14: error: identifier expected but '}' found. def orphanDot: Int = { 9. } // line 12: ident expected ^ @@ -37,4 +49,4 @@ literals.scala:29: error: ';' expected but 'def' found. literals.scala:33: error: identifier expected but 'def' found. def zeroOfNineDot: Int = 09. // line 32: malformed integer, ident expected ^ -13 errors found +17 errors found diff --git a/test/files/neg/literals.scala b/test/files/neg/literals.scala index 3df7f0b408..22d5d9acd1 100644 --- a/test/files/neg/literals.scala +++ b/test/files/neg/literals.scala @@ -1,6 +1,6 @@ /* This took me literally all day. -*/ + */ trait RejectedLiterals { def missingHex: Int = { 0x } // line 4: was: not reported, taken as zero @@ -34,3 +34,14 @@ trait Braceless { def noHexFloat: Double = 0x1.2 // line 34: ';' expected but double literal found. } + +trait MoreSadness { + + def tooTiny: Float = { 0.7e-45f } // floating point number too small + + def twoTiny: Double = { 2.0e-324 } // double precision floating point number too small + + def tooHuge: Float = { 3.4028236E38f } // floating point number too large + + def twoHuge: Double = { 1.7976931348623159e308 } // double precision floating point number too large +} diff --git a/test/files/neg/maxerrs.check b/test/files/neg/maxerrs.check new file mode 100644 index 0000000000..5eaedad487 --- /dev/null +++ b/test/files/neg/maxerrs.check @@ -0,0 +1,16 @@ +maxerrs.scala:22: error: type mismatch; + found : String("") + required: Int + def F = f("") + ^ +maxerrs.scala:24: error: type mismatch; + found : String("") + required: Int + def g = f("") + ^ +maxerrs.scala:26: error: type mismatch; + found : String("") + required: Int + def h = f("") + ^ +5 errors found diff --git a/test/files/neg/maxerrs.flags b/test/files/neg/maxerrs.flags new file mode 100644 index 0000000000..6629ef62b6 --- /dev/null +++ b/test/files/neg/maxerrs.flags @@ -0,0 +1 @@ +-Xmaxerrs 3 -Xfatal-warnings -deprecation diff --git a/test/files/neg/maxerrs.scala b/test/files/neg/maxerrs.scala new file mode 100644 index 0000000000..43b725de7a --- /dev/null +++ b/test/files/neg/maxerrs.scala @@ -0,0 +1,32 @@ + +object X { + @deprecated("just to annoy people", since="forever") + def x = 42 + + def f(i: Int) = i +} + +trait T { + import X._ + + def a = x + + def b = x + + def c = x + + def d = x + + def e = x + + def F = f("") + + def g = f("") + + def h = f("") + + def i = f("") + + def j = f("") +} + diff --git a/test/files/neg/maxwarns.check b/test/files/neg/maxwarns.check new file mode 100644 index 0000000000..f4c8d907bd --- /dev/null +++ b/test/files/neg/maxwarns.check @@ -0,0 +1,12 @@ +maxwarns.scala:12: warning: method x in object X is deprecated (since forever): just to annoy people + def a = x + ^ +maxwarns.scala:14: warning: method x in object X is deprecated (since forever): just to annoy people + def b = x + ^ +maxwarns.scala:16: warning: method x in object X is deprecated (since forever): just to annoy people + def c = x + ^ +error: No warnings can be incurred under -Xfatal-warnings. +5 warnings found +one error found diff --git a/test/files/neg/maxwarns.flags b/test/files/neg/maxwarns.flags new file mode 100644 index 0000000000..d5d6e533e9 --- /dev/null +++ b/test/files/neg/maxwarns.flags @@ -0,0 +1 @@ +-Xmaxwarns 3 -Xfatal-warnings -deprecation diff --git a/test/files/neg/maxwarns.scala b/test/files/neg/maxwarns.scala new file mode 100644 index 0000000000..decb8a7866 --- /dev/null +++ b/test/files/neg/maxwarns.scala @@ -0,0 +1,32 @@ + +object X { + @deprecated("just to annoy people", since="forever") + def x = 42 + + def f(i: String) = i +} + +trait T { + import X._ + + def a = x + + def b = x + + def c = x + + def d = x + + def e = x + + def F = f("") + + def g = f("") + + def h = f("") + + def i = f("") + + def j = f("") +} + diff --git a/test/files/neg/nested-fn-print.check b/test/files/neg/nested-fn-print.check index ea278554d4..feeac0733f 100644 --- a/test/files/neg/nested-fn-print.check +++ b/test/files/neg/nested-fn-print.check @@ -1,4 +1,4 @@ -nested-fn-print.scala:4: error: only classes can have declared but undefined members +nested-fn-print.scala:4: error: only traits and abstract classes can have declared but undefined members (Note that variables need to be initialized to be defined) var x3: Int => Double ^ diff --git a/test/files/neg/quasiquotes-syntax-error-position.check b/test/files/neg/quasiquotes-syntax-error-position.check index 9fd6ce0417..b12a7d13d6 100644 --- a/test/files/neg/quasiquotes-syntax-error-position.check +++ b/test/files/neg/quasiquotes-syntax-error-position.check @@ -16,8 +16,7 @@ quasiquotes-syntax-error-position.scala:9: error: '{' expected but end of quote quasiquotes-syntax-error-position.scala:10: error: ';' expected but '@' found. q"foo@$a" ^ -quasiquotes-syntax-error-position.scala:11: error: case classes without a parameter list are not allowed; -use either case objects or case classes with an explicit `()' as a parameter list. +quasiquotes-syntax-error-position.scala:11: error: case classes must have a parameter list; try 'case class A()' or 'case object A' q"case class A" ^ quasiquotes-syntax-error-position.scala:12: error: identifier expected but ']' found. diff --git a/test/files/neg/t10066.check b/test/files/neg/t10066.check new file mode 100644 index 0000000000..3555205d83 --- /dev/null +++ b/test/files/neg/t10066.check @@ -0,0 +1,7 @@ +t10066.scala:33: error: could not find implicit value for parameter extractor: dynamicrash.Extractor[String] + println(storage.foo[String]) + ^ +t10066.scala:37: error: could not find implicit value for parameter extractor: dynamicrash.Extractor[A] + println(storage.foo) + ^ +two errors found diff --git a/test/files/neg/t10066.scala b/test/files/neg/t10066.scala new file mode 100644 index 0000000000..ef52f333dd --- /dev/null +++ b/test/files/neg/t10066.scala @@ -0,0 +1,38 @@ +package dynamicrash + +import scala.language.dynamics + +class Config + +trait Extractor[A] { + def extract(config: Config, name: String): A +} + +object Extractor { + // note missing "implicit" + val stringExtractor = new Extractor[String] { + override def extract(config: Config, name: String): String = ??? + } +} + +class Workspace extends Dynamic { + val config: Config = new Config + + def selectDynamic[A](name: String)(implicit extractor: Extractor[A]): A = + extractor.extract(config, name) +} + +object Main { + val storage = new Workspace + + // this line works fine + // val a = storage.foo + + // this line crashes the compiler ("head of empty list") + // in ContextErrors$InferencerContextErrors$InferErrorGen$.NotWithinBoundsErrorMessage + println(storage.foo[String]) + + // this line crashes the compiler in different way ("unknown type") + // in the backend, warning: an unexpected type representation reached the compiler backend while compiling Test.scala: <error> + println(storage.foo) +} diff --git a/test/files/neg/t10097.check b/test/files/neg/t10097.check new file mode 100644 index 0000000000..1f70546b57 --- /dev/null +++ b/test/files/neg/t10097.check @@ -0,0 +1,10 @@ +t10097.scala:2: error: case classes must have a non-implicit parameter list; try 'case class C()(...)' +case class C(implicit val c: Int) + ^ +t10097.scala:4: error: case classes must have a non-implicit parameter list; try 'case class D()(...)(...)' +case class D(implicit c: Int)(s: String) + ^ +t10097.scala:4: error: an implicit parameter section must be last +case class D(implicit c: Int)(s: String) + ^ +three errors found diff --git a/test/files/neg/t10097.flags b/test/files/neg/t10097.flags new file mode 100644 index 0000000000..714bbf5125 --- /dev/null +++ b/test/files/neg/t10097.flags @@ -0,0 +1 @@ +-Xsource:2.13 diff --git a/test/files/neg/t10097.scala b/test/files/neg/t10097.scala new file mode 100644 index 0000000000..b2f05e2972 --- /dev/null +++ b/test/files/neg/t10097.scala @@ -0,0 +1,4 @@ + +case class C(implicit val c: Int) + +case class D(implicit c: Int)(s: String) diff --git a/test/files/neg/t10097b.check b/test/files/neg/t10097b.check new file mode 100644 index 0000000000..14535fee34 --- /dev/null +++ b/test/files/neg/t10097b.check @@ -0,0 +1,6 @@ +t10097b.scala:2: warning: case classes should have a non-implicit parameter list; adapting to 'case class C()(...)' +case class C(implicit val c: Int) + ^ +error: No warnings can be incurred under -Xfatal-warnings. +one warning found +one error found diff --git a/test/files/neg/t10097b.flags b/test/files/neg/t10097b.flags new file mode 100644 index 0000000000..c6bfaf1f64 --- /dev/null +++ b/test/files/neg/t10097b.flags @@ -0,0 +1 @@ +-deprecation -Xfatal-warnings diff --git a/test/files/neg/t10097b.scala b/test/files/neg/t10097b.scala new file mode 100644 index 0000000000..f166db6792 --- /dev/null +++ b/test/files/neg/t10097b.scala @@ -0,0 +1,3 @@ + +case class C(implicit val c: Int) + diff --git a/test/files/neg/t565.check b/test/files/neg/t565.check index 136cc94b6f..d7657c0f5d 100644 --- a/test/files/neg/t565.check +++ b/test/files/neg/t565.check @@ -1,4 +1,4 @@ -t565.scala:2: error: only classes can have declared but undefined members +t565.scala:2: error: only traits and abstract classes can have declared but undefined members (Note that variables need to be initialized to be defined) var s0: String ^ diff --git a/test/files/neg/t7014.check b/test/files/neg/t7014.check index 07ad51e9d3..c68c170835 100644 --- a/test/files/neg/t7014.check +++ b/test/files/neg/t7014.check @@ -1,4 +1,4 @@ -warning: While parsing annotations in t7014-neg.obj/t7014/ThreadSafetyLevel.class, could not find COMPLETELY_THREADSAFE in enum object ThreadSafetyLevel. +warning: While parsing annotations in t7014-neg.obj/t7014/ThreadSafetyLevel_1.class, could not find COMPLETELY_THREADSAFE in enum object ThreadSafetyLevel_1. This is likely due to an implementation restriction: an annotation argument cannot refer to a member of the annotated class (SI-7014). error: No warnings can be incurred under -Xfatal-warnings. one warning found diff --git a/test/files/neg/t7014/ThreadSafetyLevel.java b/test/files/neg/t7014/ThreadSafetyLevel_1.java index 4df1dc787a..eeca65366b 100644 --- a/test/files/neg/t7014/ThreadSafetyLevel.java +++ b/test/files/neg/t7014/ThreadSafetyLevel_1.java @@ -4,5 +4,5 @@ package t7014; // package needed due to other bug in scalac's java parser // and on doing so, fail to find a symbol for the COMPLETELY_THREADSAFE reference // from the annotation's argument to the enum's member // for now, let's just not crash -- should implement lazy completing at some point -@ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) -public enum ThreadSafetyLevel { COMPLETELY_THREADSAFE } +@ThreadSafety_1(level=ThreadSafetyLevel_1.COMPLETELY_THREADSAFE) +public enum ThreadSafetyLevel_1 { COMPLETELY_THREADSAFE } diff --git a/test/files/neg/t7014/ThreadSafety.java b/test/files/neg/t7014/ThreadSafety_1.java index ed508804e3..e68b103d1f 100644 --- a/test/files/neg/t7014/ThreadSafety.java +++ b/test/files/neg/t7014/ThreadSafety_1.java @@ -4,6 +4,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) // must be exactly RUNTIME retention (those we parse) -public @interface ThreadSafety { - ThreadSafetyLevel level(); +public @interface ThreadSafety_1 { + ThreadSafetyLevel_1 level(); }
\ No newline at end of file diff --git a/test/files/neg/t7014/t7014.scala b/test/files/neg/t7014/t7014.scala deleted file mode 100644 index 7c73f700be..0000000000 --- a/test/files/neg/t7014/t7014.scala +++ /dev/null @@ -1,3 +0,0 @@ -package t7014 - -import ThreadSafetyLevel.COMPLETELY_THREADSAFE // refer to annotation so it gets parsed diff --git a/test/files/neg/t7014/t7014_2.scala b/test/files/neg/t7014/t7014_2.scala new file mode 100644 index 0000000000..4845fc9a5d --- /dev/null +++ b/test/files/neg/t7014/t7014_2.scala @@ -0,0 +1,3 @@ +package t7014 + +import ThreadSafetyLevel_1.COMPLETELY_THREADSAFE // refer to annotation so it gets parsed diff --git a/test/files/neg/t8217-local-alias-requires-rhs.check b/test/files/neg/t8217-local-alias-requires-rhs.check index d970400ff6..383b1f8d63 100644 --- a/test/files/neg/t8217-local-alias-requires-rhs.check +++ b/test/files/neg/t8217-local-alias-requires-rhs.check @@ -1,10 +1,10 @@ -t8217-local-alias-requires-rhs.scala:3: error: only classes can have declared but undefined members +t8217-local-alias-requires-rhs.scala:3: error: only traits and abstract classes can have declared but undefined members type A ^ -t8217-local-alias-requires-rhs.scala:6: error: only classes can have declared but undefined members +t8217-local-alias-requires-rhs.scala:6: error: only traits and abstract classes can have declared but undefined members type B ^ -t8217-local-alias-requires-rhs.scala:14: error: only classes can have declared but undefined members +t8217-local-alias-requires-rhs.scala:14: error: only traits and abstract classes can have declared but undefined members def this(a: Any) = { this(); type C } ^ three errors found diff --git a/test/files/neg/t8685.check b/test/files/neg/t8685.check index 685fd2e951..a31e2e265a 100644 --- a/test/files/neg/t8685.check +++ b/test/files/neg/t8685.check @@ -4,6 +4,9 @@ case class D @deprecated("ctor D is depr", since="now") (i: Int) t8685.scala:35: warning: class C is deprecated (since now): class C is depr def f = C(42) ^ +t8685.scala:36: warning: constructor D in class D is deprecated (since now): ctor D is depr + def g = D(42) + ^ t8685.scala:37: warning: object E is deprecated (since now): module E is depr def h = E(42) ^ @@ -41,5 +44,5 @@ t8685.scala:53: warning: class K in object J is deprecated (since now): Inner K def l = new J.K(42) ^ error: No warnings can be incurred under -Xfatal-warnings. -14 warnings found +15 warnings found one error found diff --git a/test/files/neg/t8704.check b/test/files/neg/t8704.check new file mode 100644 index 0000000000..b567a8bb17 --- /dev/null +++ b/test/files/neg/t8704.check @@ -0,0 +1,11 @@ +t8704.scala:7: warning: 2 parameter sections are effectively implicit +class D(private implicit val i: Int)(implicit s: String) + ^ +t8704.scala:3: error: an implicit parameter section must be last +class C(i: Int)(implicit j: Int)(implicit k: Int)(n: Int) { + ^ +t8704.scala:3: error: multiple implicit parameter sections are not allowed +class C(i: Int)(implicit j: Int)(implicit k: Int)(n: Int) { + ^ +one warning found +two errors found diff --git a/test/files/neg/t8704.flags b/test/files/neg/t8704.flags new file mode 100644 index 0000000000..f175a06c74 --- /dev/null +++ b/test/files/neg/t8704.flags @@ -0,0 +1 @@ +-Ywarn-extra-implicit diff --git a/test/files/neg/t8704.scala b/test/files/neg/t8704.scala new file mode 100644 index 0000000000..db43bfcaa5 --- /dev/null +++ b/test/files/neg/t8704.scala @@ -0,0 +1,7 @@ + + +class C(i: Int)(implicit j: Int)(implicit k: Int)(n: Int) { + def f = n +} + +class D(private implicit val i: Int)(implicit s: String) diff --git a/test/files/neg/t9636.check b/test/files/neg/t9636.check new file mode 100644 index 0000000000..f36d1d32b2 --- /dev/null +++ b/test/files/neg/t9636.check @@ -0,0 +1,6 @@ +t9636.scala:11: warning: a type was inferred to be `AnyVal`; this may indicate a programming error. + if (signature.sameElements(Array(0x1F, 0x8B))) { + ^ +error: No warnings can be incurred under -Xfatal-warnings. +one warning found +one error found diff --git a/test/files/neg/t9636.flags b/test/files/neg/t9636.flags new file mode 100644 index 0000000000..7949c2afa2 --- /dev/null +++ b/test/files/neg/t9636.flags @@ -0,0 +1 @@ +-Xlint -Xfatal-warnings diff --git a/test/files/neg/t9636.scala b/test/files/neg/t9636.scala new file mode 100644 index 0000000000..7ad5fb3e9e --- /dev/null +++ b/test/files/neg/t9636.scala @@ -0,0 +1,17 @@ + +import java.io._ +import java.util.zip._ + +class C { + def isWrapper(is: FileInputStream): InputStream = { + val pb = new PushbackInputStream(is, 2) + val signature = new Array[Byte](2) + pb.read(signature) + pb.unread(signature) + if (signature.sameElements(Array(0x1F, 0x8B))) { + new GZIPInputStream(new BufferedInputStream(pb)) + } else { + pb + } + } +} diff --git a/test/files/neg/t9675.check b/test/files/neg/t9675.check new file mode 100644 index 0000000000..255477499c --- /dev/null +++ b/test/files/neg/t9675.check @@ -0,0 +1,27 @@ +t9675.scala:4: warning: comparing values of types Test.A and String using `!=' will always yield true + val func1 = (x: A) => { x != "x" } + ^ +t9675.scala:6: warning: comparing values of types Test.A and String using `!=' will always yield true + val func2 = (x: A) => { x != "x" }: Boolean + ^ +t9675.scala:8: warning: comparing values of types Test.A and String using `!=' will always yield true + val func3: Function1[A, Boolean] = (x) => { x != "x" } + ^ +t9675.scala:11: warning: comparing values of types Test.A and String using `!=' will always yield true + def apply(x: A): Boolean = { x != "x" } + ^ +t9675.scala:14: warning: comparing values of types Test.A and String using `!=' will always yield true + def method(x: A): Boolean = { x != "x" } + ^ +t9675.scala:18: warning: comparing values of types Test.A and String using `!=' will always yield true + A("x") != "x" + ^ +t9675.scala:20: warning: comparing values of types Test.A and String using `!=' will always yield true + val func5: Function1[A, Boolean] = (x) => { x != "x" } + ^ +t9675.scala:22: warning: comparing values of types Test.A and String using `!=' will always yield true + List(A("x")).foreach((item: A) => item != "x") + ^ +error: No warnings can be incurred under -Xfatal-warnings. +8 warnings found +one error found diff --git a/test/files/neg/t9675.flags b/test/files/neg/t9675.flags new file mode 100644 index 0000000000..85d8eb2ba2 --- /dev/null +++ b/test/files/neg/t9675.flags @@ -0,0 +1 @@ +-Xfatal-warnings diff --git a/test/files/neg/t9675.scala b/test/files/neg/t9675.scala new file mode 100644 index 0000000000..f76b74b6ac --- /dev/null +++ b/test/files/neg/t9675.scala @@ -0,0 +1,24 @@ +object Test { + case class A(x: String) + + val func1 = (x: A) => { x != "x" } + + val func2 = (x: A) => { x != "x" }: Boolean + + val func3: Function1[A, Boolean] = (x) => { x != "x" } + + val func4 = new Function1[A, Boolean] { + def apply(x: A): Boolean = { x != "x" } + } + + def method(x: A): Boolean = { x != "x" } + case class PersonInfo(rankPayEtc: Unit) + + def main(args: Array[String]) { + A("x") != "x" + + val func5: Function1[A, Boolean] = (x) => { x != "x" } + + List(A("x")).foreach((item: A) => item != "x") + } +} diff --git a/test/files/neg/trailing-commas.check b/test/files/neg/trailing-commas.check new file mode 100644 index 0000000000..e2677dc3f5 --- /dev/null +++ b/test/files/neg/trailing-commas.check @@ -0,0 +1,130 @@ +trailing-commas.scala:10: error: illegal start of simple expression +trait ArgumentExprs1 { f(23, "bar", )(Ev0, Ev1) } + ^ +trailing-commas.scala:10: error: ')' expected but '}' found. +trait ArgumentExprs1 { f(23, "bar", )(Ev0, Ev1) } + ^ +trailing-commas.scala:11: error: illegal start of simple expression +trait ArgumentExprs2 { f(23, "bar")(Ev0, Ev1, ) } + ^ +trailing-commas.scala:11: error: ')' expected but '}' found. +trait ArgumentExprs2 { f(23, "bar")(Ev0, Ev1, ) } + ^ +trailing-commas.scala:12: error: illegal start of simple expression +trait ArgumentExprs3 { new C(23, "bar", )(Ev0, Ev1) } + ^ +trailing-commas.scala:12: error: ')' expected but '}' found. +trait ArgumentExprs3 { new C(23, "bar", )(Ev0, Ev1) } + ^ +trailing-commas.scala:13: error: illegal start of simple expression +trait ArgumentExprs4 { new C(23, "bar")(Ev0, Ev1, ) } + ^ +trailing-commas.scala:13: error: ')' expected but '}' found. +trait ArgumentExprs4 { new C(23, "bar")(Ev0, Ev1, ) } + ^ +trailing-commas.scala:15: error: identifier expected but ')' found. +trait Params1 { def f(foo: Int, bar: String, )(implicit ev0: Ev0, ev1: Ev1, ) = 1 } + ^ +trailing-commas.scala:15: error: ':' expected but '}' found. +trait Params1 { def f(foo: Int, bar: String, )(implicit ev0: Ev0, ev1: Ev1, ) = 1 } + ^ +trailing-commas.scala:16: error: identifier expected but ')' found. +trait Params2 { def f(foo: Int, bar: String, )(implicit ev0: Ev0, ev1: Ev1, ) = 1 } + ^ +trailing-commas.scala:16: error: ':' expected but '}' found. +trait Params2 { def f(foo: Int, bar: String, )(implicit ev0: Ev0, ev1: Ev1, ) = 1 } + ^ +trailing-commas.scala:17: error: identifier expected but ')' found. +trait ClassParams1 { final class C(foo: Int, bar: String, )(implicit ev0: Ev0, ev1: Ev1) } + ^ +trailing-commas.scala:17: error: ':' expected but '}' found. +trait ClassParams1 { final class C(foo: Int, bar: String, )(implicit ev0: Ev0, ev1: Ev1) } + ^ +trailing-commas.scala:18: error: identifier expected but ')' found. +trait ClassParams2 { final class C(foo: Int, bar: String)(implicit ev0: Ev0, ev1: Ev1, ) } + ^ +trailing-commas.scala:18: error: ':' expected but '}' found. +trait ClassParams2 { final class C(foo: Int, bar: String)(implicit ev0: Ev0, ev1: Ev1, ) } + ^ +trailing-commas.scala:20: error: illegal start of simple expression +trait SimpleExpr { (23, "bar", ) } + ^ +trailing-commas.scala:20: error: ')' expected but '}' found. +trait SimpleExpr { (23, "bar", ) } + ^ +trailing-commas.scala:22: error: identifier expected but ']' found. +trait TypeArgs { def f: C[Int, String, ] } + ^ +trailing-commas.scala:22: error: ']' expected but '}' found. +trait TypeArgs { def f: C[Int, String, ] } + ^ +trailing-commas.scala:23: error: identifier expected but ']' found. +trait TypeParamClause { type C[A, B, ] } + ^ +trailing-commas.scala:23: error: ']' expected but '}' found. +trait TypeParamClause { type C[A, B, ] } + ^ +trailing-commas.scala:24: error: identifier expected but ']' found. +trait FunTypeParamClause { def f[A, B, ] } + ^ +trailing-commas.scala:24: error: ']' expected but '}' found. +trait FunTypeParamClause { def f[A, B, ] } + ^ +trailing-commas.scala:26: error: identifier expected but ')' found. +trait SimpleType { def f: (Int, String, ) } + ^ +trailing-commas.scala:26: error: ')' expected but '}' found. +trait SimpleType { def f: (Int, String, ) } + ^ +trailing-commas.scala:27: error: identifier expected but ')' found. +trait FunctionArgTypes { def f: (Int, String, ) => Boolean } + ^ +trailing-commas.scala:27: error: ')' expected but '}' found. +trait FunctionArgTypes { def f: (Int, String, ) => Boolean } + ^ +trailing-commas.scala:29: error: illegal start of simple pattern +trait SimplePattern { val (foo, bar, ) = null: Any } + ^ +trailing-commas.scala:31: error: identifier expected but '}' found. +trait ImportSelectors { import foo.{ Ev0, Ev1, } } + ^ +trailing-commas.scala:33: error: identifier expected but '}' found. +trait Import { import foo.Ev0, foo.Ev1, } + ^ +trailing-commas.scala:35: error: illegal start of simple pattern +trait ValDcl { val foo, bar, = 23 } + ^ +trailing-commas.scala:35: error: '=' expected but '}' found. +trait ValDcl { val foo, bar, = 23 } + ^ +trailing-commas.scala:36: error: illegal start of simple pattern +trait VarDcl { var foo, bar, = 23 } + ^ +trailing-commas.scala:36: error: '=' expected but '}' found. +trait VarDcl { var foo, bar, = 23 } + ^ +trailing-commas.scala:37: error: illegal start of simple pattern +trait VarDef { var foo, bar, = _ } + ^ +trailing-commas.scala:37: error: '=' expected but '}' found. +trait VarDef { var foo, bar, = _ } + ^ +trailing-commas.scala:38: error: illegal start of simple pattern +trait PatDef { val Foo(foo), Bar(bar), = bippy } + ^ +trailing-commas.scala:38: error: '=' expected but '}' found. +trait PatDef { val Foo(foo), Bar(bar), = bippy } + ^ +trailing-commas.scala:45: error: illegal start of simple expression +trait SimpleExpr2 { (23, ) } + ^ +trailing-commas.scala:45: error: ')' expected but '}' found. +trait SimpleExpr2 { (23, ) } + ^ +trailing-commas.scala:48: error: identifier expected but ')' found. +trait SimpleType2 { def f: (Int, ) } + ^ +trailing-commas.scala:48: error: ')' expected but '}' found. +trait SimpleType2 { def f: (Int, ) } + ^ +43 errors found diff --git a/test/files/neg/trailing-commas.scala b/test/files/neg/trailing-commas.scala new file mode 100644 index 0000000000..a873cb1e39 --- /dev/null +++ b/test/files/neg/trailing-commas.scala @@ -0,0 +1,56 @@ +package foo + +// Note: Using traits to get distinct errors +// (instead of sharing one single "')' expected but '}' found." at the end) + + + +//// Multi-line only cases: make sure trailing commas are only supported when multi-line + +trait ArgumentExprs1 { f(23, "bar", )(Ev0, Ev1) } +trait ArgumentExprs2 { f(23, "bar")(Ev0, Ev1, ) } +trait ArgumentExprs3 { new C(23, "bar", )(Ev0, Ev1) } +trait ArgumentExprs4 { new C(23, "bar")(Ev0, Ev1, ) } + +trait Params1 { def f(foo: Int, bar: String, )(implicit ev0: Ev0, ev1: Ev1, ) = 1 } +trait Params2 { def f(foo: Int, bar: String, )(implicit ev0: Ev0, ev1: Ev1, ) = 1 } +trait ClassParams1 { final class C(foo: Int, bar: String, )(implicit ev0: Ev0, ev1: Ev1) } +trait ClassParams2 { final class C(foo: Int, bar: String)(implicit ev0: Ev0, ev1: Ev1, ) } + +trait SimpleExpr { (23, "bar", ) } + +trait TypeArgs { def f: C[Int, String, ] } +trait TypeParamClause { type C[A, B, ] } +trait FunTypeParamClause { def f[A, B, ] } + +trait SimpleType { def f: (Int, String, ) } +trait FunctionArgTypes { def f: (Int, String, ) => Boolean } + +trait SimplePattern { val (foo, bar, ) = null: Any } + +trait ImportSelectors { import foo.{ Ev0, Ev1, } } + +trait Import { import foo.Ev0, foo.Ev1, } + +trait ValDcl { val foo, bar, = 23 } +trait VarDcl { var foo, bar, = 23 } +trait VarDef { var foo, bar, = _ } +trait PatDef { val Foo(foo), Bar(bar), = bippy } + + + +//// The Tuple 1 cases + +// the Tuple1 value case: make sure that the possible "(23, )" syntax for Tuple1 doesn't compile to "23" +trait SimpleExpr2 { (23, ) } + +// the Tuple1 type case: make sure that the possible "(Int, )" syntax for Tuple1[Int] doesn't compile to "Int" +trait SimpleType2 { def f: (Int, ) } + + + +//// Test utilities +object `package` { + sealed trait Ev0; implicit object Ev0 extends Ev0 + sealed trait Ev1; implicit object Ev1 extends Ev1 +} diff --git a/test/files/neg/warn-inferred-any.check b/test/files/neg/warn-inferred-any.check index 8ad81d1529..2b321a83c9 100644 --- a/test/files/neg/warn-inferred-any.check +++ b/test/files/neg/warn-inferred-any.check @@ -9,7 +9,7 @@ warn-inferred-any.scala:17: warning: a type was inferred to be `AnyVal`; this ma ^ warn-inferred-any.scala:25: warning: a type was inferred to be `Any`; this may indicate a programming error. def za = f(1, "one") - ^ + ^ error: No warnings can be incurred under -Xfatal-warnings. four warnings found one error found diff --git a/test/files/pos/sam_erasure_boundedwild.scala b/test/files/pos/sam_erasure_boundedwild.scala new file mode 100644 index 0000000000..1ec27e0ea4 --- /dev/null +++ b/test/files/pos/sam_erasure_boundedwild.scala @@ -0,0 +1,11 @@ +class Test { + trait Q[T] { + def toArray[T](x: Array[T]): Array[T] + def toArray(): Array[T] + } + + def crashTyper: Array[_] = { + val x : Q[_] = ??? + x.toArray // crashes while doing overload resolution + } +}
\ No newline at end of file diff --git a/test/files/pos/t10066.scala b/test/files/pos/t10066.scala new file mode 100644 index 0000000000..bef85cb08c --- /dev/null +++ b/test/files/pos/t10066.scala @@ -0,0 +1,38 @@ +package dynamicrash + +import scala.language.dynamics + +class Config + +trait Extractor[A] { + def extract(config: Config, name: String): A +} + +object Extractor { + // this has "implicit", unlike the corresponding neg test + implicit val stringExtractor = new Extractor[String] { + override def extract(config: Config, name: String): String = ??? + } +} + +class Workspace extends Dynamic { + val config: Config = new Config + + def selectDynamic[A](name: String)(implicit extractor: Extractor[A]): A = + extractor.extract(config, name) +} + +object Main { + val storage = new Workspace + + // this line works fine + // val a = storage.foo + + // this line crashes the compiler ("head of empty list") + // in ContextErrors$InferencerContextErrors$InferErrorGen$.NotWithinBoundsErrorMessage + println(storage.foo[String]) + + // this line crashes the compiler in different way ("unknown type") + // in the backend, warning: an unexpected type representation reached the compiler backend while compiling Test.scala: <error> + println(storage.foo) +} diff --git a/test/files/pos/t10154.scala b/test/files/pos/t10154.scala new file mode 100644 index 0000000000..51616b71d6 --- /dev/null +++ b/test/files/pos/t10154.scala @@ -0,0 +1,11 @@ +trait Bar2[T] + +object Test2 { + def wrap { + object Foo { + implicit def fooBar: Bar2[Foo.type] = ??? + } + + implicitly[Bar2[Foo.type]] + } +} diff --git a/test/files/pos/t10154b.scala b/test/files/pos/t10154b.scala new file mode 100644 index 0000000000..809a286c0e --- /dev/null +++ b/test/files/pos/t10154b.scala @@ -0,0 +1,16 @@ + import scala.language.existentials + + class Bar[T] + class Test { + def method = { + object Foo { + implicit def x: Bar[Foo.type] = new Bar[Foo.type] + } + type T = Foo.type + + { + object Foo + implicitly[Bar[T]] + } + } +} diff --git a/test/files/pos/t9331.scala b/test/files/pos/t9331.scala new file mode 100644 index 0000000000..00a667886f --- /dev/null +++ b/test/files/pos/t9331.scala @@ -0,0 +1,6 @@ +import scala.language.higherKinds + +trait Proxy[+T] +case class Stuff[+P[PP] <: Proxy[PP]]() { + // canEqual was incorrectly synthetized and started reporting a kind error. +} diff --git a/test/files/pos/trailing-commas.scala b/test/files/pos/trailing-commas.scala new file mode 100644 index 0000000000..b9401fe49d --- /dev/null +++ b/test/files/pos/trailing-commas.scala @@ -0,0 +1,155 @@ +package foo + +trait ArgumentExprs1 { + def f(foo: Int, bar: String)(implicit ev0: Ev0, ev1: Ev1) = 1 + f( + 23, + "bar", + )( + Ev0, + Ev1, + ) + + // test arg exprs in the presence of varargs + def g(x: Int, y: Int*) = 1 + g(1,2, + ) + g(1,List(2, 3): _*, + ) +} + +trait ArgumentExprs2 { + class C(foo: Int, bar: String)(implicit ev0: Ev0, ev1: Ev1) + new C( + 23, + "bar", + )( + Ev0, + Ev1, + ) +} + +trait Params { + def f( + foo: Int, + bar: String, + )(implicit + ev0: Ev0, + ev1: Ev1, + ) +} + +trait ClassParams { + class C( + foo: Int, + bar: String, + )(implicit + ev0: Ev0, + ev1: Ev1, + ) + + // test class params in the precense of varargs + case class D(i: Int*, + ) +} + +trait SimpleExpr1 { + def f: (Int, String) = ( + 23, + "bar", + ) + + // the Tuple1 value case, the trailing comma is ignored so the type is Int and the value 23 + def g: Int = ( + 23, + ) +} + +trait TypeArgs { + class C[A, B] + def f: C[ + Int, + String, + ] +} + +trait TypeParamClause { + class C[ + A, + B, + ] +} + +trait FunTypeParamClause { + def f[ + A, + B, + ] +} + +trait SimpleType { + def f: ( + Int, + String, + ) + + // the Tuple1 type case, the trailing comma is ignored so the type is Int and the value 23 + def g: ( + Int, + ) = 23 +} + +trait FunctionArgTypes { + def f: ( + Int, + String, + ) => Boolean +} + +trait SimplePattern { + val ( + foo, + bar, + ) = null: Any + + // test '@' syntax in patterns + Some(1) match { + case Some(x @ 1, + ) => x + } + + // test ': _*' syntax in patterns + List(1, 2, 3) match { + case List(1, 2, _ @ _*, + ) => 1 + } + + // test varargs in patterns + val List(x, y, _*, + ) = 42 :: 17 :: Nil +} + +trait ImportSelectors { + import foo.{ + Ev0, + Ev1, + } +} + +trait Bindings { + def g(f: (Int, String) => Boolean) + + g(( + foo, + bar, + ) => true) +} + +// Import, ids, ValDcl, VarDcl, VarDef, PatDef use commas, but not inside paren, bracket or brace, +// so they don't support an optional trailing comma + +// test utilities +object `package` { + sealed trait Ev0; implicit object Ev0 extends Ev0 + sealed trait Ev1; implicit object Ev1 extends Ev1 +} diff --git a/test/files/run/bcodeInlinerMixed/B_1.scala b/test/files/run/bcodeInlinerMixed/B_1.scala index 2aadeccb82..b26f2f1dd5 100644 --- a/test/files/run/bcodeInlinerMixed/B_1.scala +++ b/test/files/run/bcodeInlinerMixed/B_1.scala @@ -1,15 +1,13 @@ -// Partest does proper mixed compilation: +// Since 1.0.18, partest does mixed compilation only in two stages // 1. scalac *.scala *.java // 2. javac *.java -// 3. scalc *.scala -// -// In the second scalc round, the classfile for A_1 is on the classpath. -// Therefore the inliner has access to the bytecode of `bar`, which means -// it can verify that the invocation to `bar` can be safely inlined. // -// So both callsites of `flop` are inlined. +// Before it used to do a third stage +// 3. scalc *.scala // -// In a single mixed compilation, `flop` cannot be inlined, see JUnit InlinerTest.scala, def mixedCompilationNoInline. +// Because he inliner doesn't has access to the bytecode of `bar`, it cannot verify whether the +// invocation of `bar` can be safely copied to a differnet place, so `flop` is not inlined to `B.g` +// or `C.h`. class B { @inline final def flop = A_1.bar diff --git a/test/files/run/bcodeInlinerMixed/Test.scala b/test/files/run/bcodeInlinerMixed/Test.scala deleted file mode 100644 index c8c7a9fe2a..0000000000 --- a/test/files/run/bcodeInlinerMixed/Test.scala +++ /dev/null @@ -1,16 +0,0 @@ -import scala.tools.partest.{BytecodeTest, ASMConverters} -import ASMConverters._ - -object Test extends BytecodeTest { - def show: Unit = { - val gIns = instructionsFromMethod(getMethod(loadClassNode("B"), "g")) - val hIns = instructionsFromMethod(getMethod(loadClassNode("C"), "h")) - // val invocation = Invoke(INVOKESTATIC, A_1, bar, ()I, false) - for (i <- List(gIns, hIns)) { - assert(i exists { - case Invoke(_, _, "bar", "()I", _) => true - case _ => false - }, i mkString "\n") - } - } -} diff --git a/test/files/run/bcodeInlinerMixed/Test_2.scala b/test/files/run/bcodeInlinerMixed/Test_2.scala new file mode 100644 index 0000000000..db1ea14a8f --- /dev/null +++ b/test/files/run/bcodeInlinerMixed/Test_2.scala @@ -0,0 +1,30 @@ +import scala.tools.partest.{BytecodeTest, ASMConverters} +import ASMConverters._ + +class D { + // This is compiled with `A_1.class` on the classpath. When inlining `flop` (which invokes + // `A_1.bar`), the inliner can check that the call to `A_1.bar` can be safely inlined into a + // different classfile (D). See also comment in B_1.scala. + def m(b: B) = b.flop +} + +object Test extends BytecodeTest { + def show: Unit = { + val gIns = instructionsFromMethod(getMethod(loadClassNode("B"), "g")) + val hIns = instructionsFromMethod(getMethod(loadClassNode("C"), "h")) + for (i <- List(gIns, hIns)) { + assert(i exists { + // `flop` is not inlined + case Invoke(_, _, "flop", "()I", _) => true + case _ => false + }, i mkString "\n") + } + + val mIns = instructionsFromMethod(getMethod(loadClassNode("D"), "m")) + assert(mIns exists { + // `flop` is inlined, we get a call to `bar` + case Invoke(_, _, "bar", "()I", _) => true + case _ => false + }, mIns mkString "\n") + } +} diff --git a/test/files/run/existentials-in-compiler.check b/test/files/run/existentials-in-compiler.check index b0d852865d..8800df0823 100644 --- a/test/files/run/existentials-in-compiler.check +++ b/test/files/run/existentials-in-compiler.check @@ -2,28 +2,28 @@ abstract trait Bippy[A <: AnyRef, B] extends AnyRef extest.Bippy[_ <: AnyRef, _] abstract trait BippyBud[A <: AnyRef, B, C <: List[A]] extends AnyRef - extest.BippyBud[A,B,C] forSome { A <: AnyRef; B; C <: List[A] } + extest.BippyBud[?0,?1,?2] forSome { type ?0 <: AnyRef; type ?1; type ?2 <: List[?0] } abstract trait BippyLike[A <: AnyRef, B <: List[A], This <: extest.BippyLike[A,B,This] with extest.Bippy[A,B]] extends AnyRef - extest.BippyLike[A,B,This] forSome { A <: AnyRef; B <: List[A]; This <: extest.BippyLike[A,B,This] with extest.Bippy[A,B] } + extest.BippyLike[?0,?1,?2] forSome { type ?0 <: AnyRef; type ?1 <: List[?0]; type ?2 <: extest.BippyLike[?0,?1,?2] with extest.Bippy[?0,?1] } abstract trait Contra[-A >: AnyRef, -B] extends AnyRef - extest.Contra[AnyRef, _] + extest.Contra[_ >: AnyRef, _] abstract trait ContraLike[-A >: AnyRef, -B >: List[A]] extends AnyRef - extest.ContraLike[A,B] forSome { -A >: AnyRef; -B >: List[A] } + extest.ContraLike[?0,?1] forSome { type ?0 >: AnyRef; type ?1 >: List[?0] } abstract trait Cov01[+A <: AnyRef, +B] extends AnyRef - extest.Cov01[AnyRef,Any] + extest.Cov01[_ <: AnyRef, _] abstract trait Cov02[+A <: AnyRef, B] extends AnyRef - extest.Cov02[AnyRef, _] + extest.Cov02[_ <: AnyRef, _] abstract trait Cov03[+A <: AnyRef, -B] extends AnyRef - extest.Cov03[AnyRef, _] + extest.Cov03[_ <: AnyRef, _] abstract trait Cov04[A <: AnyRef, +B] extends AnyRef - extest.Cov04[_ <: AnyRef, Any] + extest.Cov04[_ <: AnyRef, _] abstract trait Cov05[A <: AnyRef, B] extends AnyRef extest.Cov05[_ <: AnyRef, _] @@ -32,7 +32,7 @@ abstract trait Cov06[A <: AnyRef, -B] extends AnyRef extest.Cov06[_ <: AnyRef, _] abstract trait Cov07[-A <: AnyRef, +B] extends AnyRef - extest.Cov07[_ <: AnyRef, Any] + extest.Cov07[_ <: AnyRef, _] abstract trait Cov08[-A <: AnyRef, B] extends AnyRef extest.Cov08[_ <: AnyRef, _] @@ -41,16 +41,16 @@ abstract trait Cov09[-A <: AnyRef, -B] extends AnyRef extest.Cov09[_ <: AnyRef, _] abstract trait Cov11[+A <: AnyRef, +B <: List[_]] extends AnyRef - extest.Cov11[AnyRef,List[_]] + extest.Cov11[_ <: AnyRef, _ <: List[_]] abstract trait Cov12[+A <: AnyRef, B <: List[_]] extends AnyRef - extest.Cov12[AnyRef, _ <: List[_]] + extest.Cov12[_ <: AnyRef, _ <: List[_]] abstract trait Cov13[+A <: AnyRef, -B <: List[_]] extends AnyRef - extest.Cov13[AnyRef, _ <: List[_]] + extest.Cov13[_ <: AnyRef, _ <: List[_]] abstract trait Cov14[A <: AnyRef, +B <: List[_]] extends AnyRef - extest.Cov14[_ <: AnyRef, List[_]] + extest.Cov14[_ <: AnyRef, _ <: List[_]] abstract trait Cov15[A <: AnyRef, B <: List[_]] extends AnyRef extest.Cov15[_ <: AnyRef, _ <: List[_]] @@ -59,7 +59,7 @@ abstract trait Cov16[A <: AnyRef, -B <: List[_]] extends AnyRef extest.Cov16[_ <: AnyRef, _ <: List[_]] abstract trait Cov17[-A <: AnyRef, +B <: List[_]] extends AnyRef - extest.Cov17[_ <: AnyRef, List[_]] + extest.Cov17[_ <: AnyRef, _ <: List[_]] abstract trait Cov18[-A <: AnyRef, B <: List[_]] extends AnyRef extest.Cov18[_ <: AnyRef, _ <: List[_]] @@ -68,16 +68,16 @@ abstract trait Cov19[-A <: AnyRef, -B <: List[_]] extends AnyRef extest.Cov19[_ <: AnyRef, _ <: List[_]] abstract trait Cov21[+A, +B] extends AnyRef - extest.Cov21[Any,Any] + extest.Cov21[_, _] abstract trait Cov22[+A, B] extends AnyRef - extest.Cov22[Any, _] + extest.Cov22[_, _] abstract trait Cov23[+A, -B] extends AnyRef - extest.Cov23[Any, _] + extest.Cov23[_, _] abstract trait Cov24[A, +B] extends AnyRef - extest.Cov24[_, Any] + extest.Cov24[_, _] abstract trait Cov25[A, B] extends AnyRef extest.Cov25[_, _] @@ -86,7 +86,7 @@ abstract trait Cov26[A, -B] extends AnyRef extest.Cov26[_, _] abstract trait Cov27[-A, +B] extends AnyRef - extest.Cov27[_, Any] + extest.Cov27[_, _] abstract trait Cov28[-A, B] extends AnyRef extest.Cov28[_, _] @@ -95,43 +95,43 @@ abstract trait Cov29[-A, -B] extends AnyRef extest.Cov29[_, _] abstract trait Cov31[+A, +B, C <: (A, B)] extends AnyRef - extest.Cov31[A,B,C] forSome { +A; +B; C <: (A, B) } + extest.Cov31[?0,?1,?2] forSome { type ?0; type ?1; type ?2 <: (?0, ?1) } abstract trait Cov32[+A, B, C <: (A, B)] extends AnyRef - extest.Cov32[A,B,C] forSome { +A; B; C <: (A, B) } + extest.Cov32[?0,?1,?2] forSome { type ?0; type ?1; type ?2 <: (?0, ?1) } abstract trait Cov33[+A, -B, C <: Tuple2[A, _]] extends AnyRef - extest.Cov33[A,B,C] forSome { +A; -B; C <: Tuple2[A, _] } + extest.Cov33[?0,?1,?2] forSome { type ?0; type ?1; type ?2 <: Tuple2[?0, _] } abstract trait Cov34[A, +B, C <: (A, B)] extends AnyRef - extest.Cov34[A,B,C] forSome { A; +B; C <: (A, B) } + extest.Cov34[?0,?1,?2] forSome { type ?0; type ?1; type ?2 <: (?0, ?1) } abstract trait Cov35[A, B, C <: (A, B)] extends AnyRef - extest.Cov35[A,B,C] forSome { A; B; C <: (A, B) } + extest.Cov35[?0,?1,?2] forSome { type ?0; type ?1; type ?2 <: (?0, ?1) } abstract trait Cov36[A, -B, C <: Tuple2[A, _]] extends AnyRef - extest.Cov36[A,B,C] forSome { A; -B; C <: Tuple2[A, _] } + extest.Cov36[?0,?1,?2] forSome { type ?0; type ?1; type ?2 <: Tuple2[?0, _] } abstract trait Cov37[-A, +B, C <: Tuple2[_, B]] extends AnyRef - extest.Cov37[A,B,C] forSome { -A; +B; C <: Tuple2[_, B] } + extest.Cov37[?0,?1,?2] forSome { type ?0; type ?1; type ?2 <: Tuple2[_, ?1] } abstract trait Cov38[-A, B, C <: Tuple2[_, B]] extends AnyRef - extest.Cov38[A,B,C] forSome { -A; B; C <: Tuple2[_, B] } + extest.Cov38[?0,?1,?2] forSome { type ?0; type ?1; type ?2 <: Tuple2[_, ?1] } abstract trait Cov39[-A, -B, C <: Tuple2[_, _]] extends AnyRef extest.Cov39[_, _, _ <: Tuple2[_, _]] abstract trait Cov41[+A >: Null, +B] extends AnyRef - extest.Cov41[Any,Any] + extest.Cov41[_ >: Null, _] abstract trait Cov42[+A >: Null, B] extends AnyRef - extest.Cov42[Any, _] + extest.Cov42[_ >: Null, _] abstract trait Cov43[+A >: Null, -B] extends AnyRef - extest.Cov43[Any, _] + extest.Cov43[_ >: Null, _] abstract trait Cov44[A >: Null, +B] extends AnyRef - extest.Cov44[_ >: Null, Any] + extest.Cov44[_ >: Null, _] abstract trait Cov45[A >: Null, B] extends AnyRef extest.Cov45[_ >: Null, _] @@ -140,7 +140,7 @@ abstract trait Cov46[A >: Null, -B] extends AnyRef extest.Cov46[_ >: Null, _] abstract trait Cov47[-A >: Null, +B] extends AnyRef - extest.Cov47[_ >: Null, Any] + extest.Cov47[_ >: Null, _] abstract trait Cov48[-A >: Null, B] extends AnyRef extest.Cov48[_ >: Null, _] @@ -149,8 +149,8 @@ abstract trait Cov49[-A >: Null, -B] extends AnyRef extest.Cov49[_ >: Null, _] abstract trait Covariant[+A <: AnyRef, +B] extends AnyRef - extest.Covariant[AnyRef,Any] + extest.Covariant[_ <: AnyRef, _] abstract trait CovariantLike[+A <: AnyRef, +B <: List[A], +This <: extest.CovariantLike[A,B,This] with extest.Covariant[A,B]] extends AnyRef - extest.CovariantLike[A,B,This] forSome { +A <: AnyRef; +B <: List[A]; +This <: extest.CovariantLike[A,B,This] with extest.Covariant[A,B] } + extest.CovariantLike[?0,?1,?2] forSome { type ?0 <: AnyRef; type ?1 <: List[?0]; type ?2 <: extest.CovariantLike[?0,?1,?2] with extest.Covariant[?0,?1] } diff --git a/test/files/run/existentials-in-compiler.scala b/test/files/run/existentials-in-compiler.scala index e516eddf95..e35b7231c2 100644 --- a/test/files/run/existentials-in-compiler.scala +++ b/test/files/run/existentials-in-compiler.scala @@ -79,7 +79,7 @@ package extest { exitingTyper { clazz.info println(clazz.defString) - println(" " + classExistentialType(clazz) + "\n") + println(" " + classExistentialType(clazz.owner.typeOfThis, clazz) + "\n") } } } diff --git a/test/files/run/iq.scala b/test/files/run/iq.scala index 0ccf67a2e9..9929f0e1a0 100644 --- a/test/files/run/iq.scala +++ b/test/files/run/iq.scala @@ -25,12 +25,18 @@ object iq { assert(q2 == qb) val qc = 42 +: q :+ 0 assert(q2 == qc) + assert(q ++ qa == qa) + val qdr = 1 +: 2 +: 3 +: 4 +: q + val qcon1 = 1 +: 2 +: q + val qcon2 = q :+ 3 :+ 4 + val qd = qcon1 ++ qcon2 + assert(qd == qdr) Console.println("q2: " + q2) Console.println("qa: " + qa) Console.println("qb: " + qb) Console.println("qc: " + qc) - + /* Test is empty and dequeue. * Expected: Head: 42 */ diff --git a/test/files/run/literals.scala b/test/files/run/literals.scala index 13fda05876..a7962e5cd9 100644 --- a/test/files/run/literals.scala +++ b/test/files/run/literals.scala @@ -6,7 +6,7 @@ object Test { - /* I add a couple of Unicode identifier tests here temporarily */ + /* I add a couple of Unicode identifier tests here "temporarily" */ def \u03b1\u03c1\u03b5\u03c4\u03b7 = "alpha rho epsilon tau eta" @@ -80,10 +80,17 @@ object Test { check_success("1e1f == 10.0f", 1e1f, 10.0f) check_success(".3f == 0.3f", .3f, 0.3f) check_success("0f == 0.0f", 0f, 0.0f) + check_success("0f == -0.000000000000000000e+00f", 0f, -0.000000000000000000e+00f) + check_success("0f == -0.000000000000000000e+00F", 0f, -0.000000000000000000e+00F) + check_success("0f == -0.0000000000000000e14f", 0f, -0.0000000000000000e14f) check_success("01.23f == 1.23f", 01.23f, 1.23f) check_success("3.14f == 3.14f", 3.14f, 3.14f) check_success("6.022e23f == 6.022e23f", 6.022e23f, 6.022e23f) check_success("09f == 9.0f", 09f, 9.0f) + check_success("1.00000017881393421514957253748434595763683319091796875001f == 1.0000001f", + 1.00000017881393421514957253748434595763683319091796875001f, + 1.0000001f) + check_success("3.4028235E38f == Float.MaxValue", 3.4028235E38f, Float.MaxValue) check_success("1.asInstanceOf[Float] == 1.0", 1.asInstanceOf[Float], 1.0f) check_success("1l.asInstanceOf[Float] == 1.0", 1l.asInstanceOf[Float], 1.0f) @@ -92,11 +99,17 @@ object Test { check_success(".3 == 0.3", .3, 0.3) check_success("0.0 == 0.0", 0.0, 0.0) check_success("0d == 0.0", 0d, 0.0) + check_success("0d == 0.000000000000000000e+00d", 0d, 0.000000000000000000e+00d) + check_success("0d == -0.000000000000000000e+00d", 0d, -0.000000000000000000e+00d) + check_success("0d == -0.000000000000000000e+00D", 0d, -0.000000000000000000e+00D) + check_success("0.0 == 0.000000000000000000e+00", 0.0, 0.000000000000000000e+00) + check_success("0.0 == -0.000000000000000000e+00", 0.0, -0.000000000000000000e+00) check_success("01.23 == 1.23", 01.23, 1.23) check_success("01.23d == 1.23d", 01.23d, 1.23d) check_success("3.14 == 3.14", 3.14, 3.14) check_success("1e-9d == 1.0e-9", 1e-9d, 1.0e-9) check_success("1e137 == 1.0e137", 1e137, 1.0e137) + check_success("1.7976931348623157e308d == Double.MaxValue", 1.7976931348623157e308d, Double.MaxValue) check_success("1.asInstanceOf[Double] == 1.0", 1.asInstanceOf[Double], 1.0) check_success("1l.asInstanceOf[Double] == 1.0", 1l.asInstanceOf[Double], 1.0) diff --git a/test/files/run/patmat-exprs.scala b/test/files/run/patmat-exprs.scala index 7ca5fd3063..d18df9c714 100644 --- a/test/files/run/patmat-exprs.scala +++ b/test/files/run/patmat-exprs.scala @@ -344,13 +344,13 @@ trait Pattern { } - case class Zero[T] (implicit num: NumericOps[T]) extends Leaf[T] { + case class Zero[T]()(implicit num: NumericOps[T]) extends Leaf[T] { def derivative(variable: Var[T]) = Zero[T] def eval(f: Any => Any) = num.zero override def toString = "0" } - case class One[T] (implicit num: NumericOps[T]) extends Leaf[T] { + case class One[T]()(implicit num: NumericOps[T]) extends Leaf[T] { def derivative(variable: Var[T]) = Zero[T] def eval(f: Any => Any) = num.one override def toString = "1" diff --git a/test/files/run/repl-colon-type.check b/test/files/run/repl-colon-type.check index 0fa5695155..3fdd318df6 100644 --- a/test/files/run/repl-colon-type.check +++ b/test/files/run/repl-colon-type.check @@ -75,7 +75,7 @@ TypeRef( ) TypeRef( TypeSymbol( - sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with Serializable + sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with FilteredTraversableInternal[A,List[A]] with Serializable ) args = List( @@ -142,7 +142,7 @@ TypeRef( args = List( TypeRef( TypeSymbol( - sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with Serializable + sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with FilteredTraversableInternal[A,List[A]] with Serializable ) args = List( @@ -175,7 +175,7 @@ PolyType( args = List( TypeRef( TypeSymbol( - sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with Serializable + sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with FilteredTraversableInternal[A,List[A]] with Serializable ) args = List(TypeParamTypeRef(TypeParam(T <: AnyVal))) @@ -198,7 +198,7 @@ PolyType( params = List(TermSymbol(x: T), TermSymbol(y: List[U])) resultType = TypeRef( TypeSymbol( - sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with Serializable + sealed abstract class List[+A] extends AbstractSeq[A] with LinearSeq[A] with Product with GenericTraversableTemplate[A,List] with LinearSeqOptimized[A,List[A]] with FilteredTraversableInternal[A,List[A]] with Serializable ) args = List(TypeParamTypeRef(TypeParam(U >: T))) diff --git a/test/files/run/t10026.check b/test/files/run/t10026.check new file mode 100644 index 0000000000..15a62794a9 --- /dev/null +++ b/test/files/run/t10026.check @@ -0,0 +1 @@ +List(1, 2, 3) diff --git a/test/files/run/t10026.scala b/test/files/run/t10026.scala new file mode 100644 index 0000000000..a56840c8c2 --- /dev/null +++ b/test/files/run/t10026.scala @@ -0,0 +1,11 @@ +import scala.reflect.runtime.universe +import scala.tools.reflect.ToolBox + +object Test { + def main(args: Array[String]): Unit = { + val classloader = getClass.getClassLoader + val toolbox = universe.runtimeMirror(classloader).mkToolBox() + println(toolbox.compile(toolbox.parse("Array(1, 2, 3).toList")).apply()) + } +} + diff --git a/test/files/run/t10072.scala b/test/files/run/t10072.scala new file mode 100644 index 0000000000..0f1dca1838 --- /dev/null +++ b/test/files/run/t10072.scala @@ -0,0 +1,18 @@ +trait T[A] { + def a: A + def foldLeft[B](zero: B, op: (B, A) => B): B = op(zero, a) + def sum[B >: A](zero: B): B +} + +class C[@specialized(Int) A](val a: A) extends T[A] { + override def sum[@specialized(Int) B >: A](zero: B): B = foldLeft(zero, (x: B, y: B) => x) +} + +object Test extends App { + def factory[T](a: T): C[T] = new C[T](a) + + assert(new C[Int](1).sum(2) == 2) + assert(new C[String]("ho").sum("hu") == "hu") + assert(factory[Int](1).sum(2) == 2) + assert(factory[String]("ho").sum("hu") == "hu") +} diff --git a/test/files/run/t10097.check b/test/files/run/t10097.check new file mode 100644 index 0000000000..0e8b96061c --- /dev/null +++ b/test/files/run/t10097.check @@ -0,0 +1,3 @@ +t10097.scala:2: warning: case classes should have a non-implicit parameter list; adapting to 'case class C()(...)' +case class C(implicit c: Int) + ^ diff --git a/test/files/run/t10097.flags b/test/files/run/t10097.flags new file mode 100644 index 0000000000..dcc59ebe32 --- /dev/null +++ b/test/files/run/t10097.flags @@ -0,0 +1 @@ +-deprecation diff --git a/test/files/run/t10097.scala b/test/files/run/t10097.scala new file mode 100644 index 0000000000..a16be897cc --- /dev/null +++ b/test/files/run/t10097.scala @@ -0,0 +1,6 @@ + +case class C(implicit c: Int) + +object Test extends App { + assert(C()(42).productArity == 0) +} diff --git a/test/files/run/t1459.check b/test/files/run/t1459.check new file mode 100644 index 0000000000..93b4c5a810 --- /dev/null +++ b/test/files/run/t1459.check @@ -0,0 +1,3 @@ +JavaPrinter: one two three +InheritingPrinter extends JavaPrinter: one two three +ScalaPrinter: onetwothree diff --git a/test/files/run/t1459/InheritingPrinter.scala b/test/files/run/t1459/InheritingPrinter.scala new file mode 100644 index 0000000000..70301307f5 --- /dev/null +++ b/test/files/run/t1459/InheritingPrinter.scala @@ -0,0 +1,6 @@ +class InheritingPrinter extends JavaPrinter { + override def doit(s: String*) { + print("InheritingPrinter extends ") + super.doit(s: _*); + } +}
\ No newline at end of file diff --git a/test/files/run/t1459/JavaPrinter.java b/test/files/run/t1459/JavaPrinter.java new file mode 100644 index 0000000000..3912ea613a --- /dev/null +++ b/test/files/run/t1459/JavaPrinter.java @@ -0,0 +1,7 @@ +public class JavaPrinter implements VarArg { + public void doit(String... s) { + System.out.print("JavaPrinter: "); + for(String str : s) + System.out.print(str + " "); + } +} diff --git a/test/files/run/t1459/ScalaPrinter.scala b/test/files/run/t1459/ScalaPrinter.scala new file mode 100644 index 0000000000..46305804c2 --- /dev/null +++ b/test/files/run/t1459/ScalaPrinter.scala @@ -0,0 +1,6 @@ +class ScalaPrinter extends VarArg { + override def doit(s: String*) = { + print("ScalaPrinter: ") + s.foreach(print _) + } +}
\ No newline at end of file diff --git a/test/files/run/t1459/Test.java b/test/files/run/t1459/Test.java new file mode 100644 index 0000000000..3cf91e2e8b --- /dev/null +++ b/test/files/run/t1459/Test.java @@ -0,0 +1,15 @@ +public class Test { + public static void main(String[] args) { + VarArg jp = new JavaPrinter(); + VarArg ip = new InheritingPrinter(); + VarArg sp = new ScalaPrinter(); + doYourThing(jp); + doYourThing(ip); + doYourThing(sp); + } + + public static void doYourThing(VarArg va) { + va.doit("one", "two", "three"); + System.out.println(); + } +} diff --git a/test/files/run/t1459/VarArg.java b/test/files/run/t1459/VarArg.java new file mode 100644 index 0000000000..7039f99e7b --- /dev/null +++ b/test/files/run/t1459/VarArg.java @@ -0,0 +1,3 @@ +public interface VarArg { + void doit(String... s); +} diff --git a/test/files/run/t1459generic.check b/test/files/run/t1459generic.check new file mode 100644 index 0000000000..346fadbc0d --- /dev/null +++ b/test/files/run/t1459generic.check @@ -0,0 +1,4 @@ +Note: t1459generic/Test.java uses unchecked or unsafe operations. +Note: Recompile with -Xlint:unchecked for details. +ab +ab diff --git a/test/files/run/t1459generic/Impl.scala b/test/files/run/t1459generic/Impl.scala new file mode 100644 index 0000000000..9234e70456 --- /dev/null +++ b/test/files/run/t1459generic/Impl.scala @@ -0,0 +1,4 @@ +class Impl extends VarargGeneric[String] { + def genericOne(x: String, arg: String): String = x + arg + def genericVar(x: String, args: String*): String = x + args.head +} diff --git a/test/files/run/t1459generic/Test.java b/test/files/run/t1459generic/Test.java new file mode 100644 index 0000000000..a97158796b --- /dev/null +++ b/test/files/run/t1459generic/Test.java @@ -0,0 +1,10 @@ +public class Test { + public static void main(String[] args) throws Exception { + VarargGeneric vg = new Impl(); + System.out.println(vg.genericOne("a", "b")); + System.out.println(vg.genericVar("a", "b")); + // should not result in java.lang.AbstractMethodError: Impl.genericVar(Ljava/lang/Object;[Ljava/lang/String;)Ljava/lang/String; + // --> genericVar needs a varargs bridge (scala -> java varargs) and a standard generics bridge + // (for comparison, including genericOne, which needs only a generics bridge) + } +} diff --git a/test/files/run/t1459generic/VarargGeneric.java b/test/files/run/t1459generic/VarargGeneric.java new file mode 100644 index 0000000000..9b37a0fe3f --- /dev/null +++ b/test/files/run/t1459generic/VarargGeneric.java @@ -0,0 +1,7 @@ +public interface VarargGeneric<T> { + String genericOne(T x, String args); + // we cannot annotate this with @SafeVarargs, because + // it's in an interface. so that's why a warning from + // javac appears in the checkfile. + String genericVar(T x, String... args); +} diff --git a/test/files/run/t4700.check b/test/files/run/t4700.check new file mode 100644 index 0000000000..ae854b959d --- /dev/null +++ b/test/files/run/t4700.check @@ -0,0 +1,44 @@ + +scala> import scala.annotation.showAsInfix +import scala.annotation.showAsInfix + +scala> class &&[T,U] +defined class $amp$amp + +scala> def foo: Int && Boolean = ??? +foo: Int && Boolean + +scala> def foo: Int && Boolean && String = ??? +foo: Int && Boolean && String + +scala> def foo: Int && (Boolean && String) = ??? +foo: Int && (Boolean && String) + +scala> @showAsInfix type Mappy[T, U] = Map[T, U] +defined type alias Mappy + +scala> def foo: Int Mappy (Boolean && String) = ??? +foo: Int Mappy (Boolean && String) + +scala> @showAsInfix(false) class ||[T,U] +defined class $bar$bar + +scala> def foo: Int || Boolean = ??? +foo: ||[Int,Boolean] + +scala> class &:[L, R] +defined class $amp$colon + +scala> def foo: Int &: String = ??? +foo: Int &: String + +scala> def foo: Int &: Boolean &: String = ??? +foo: Int &: Boolean &: String + +scala> def foo: (Int && String) &: Boolean = ??? +foo: (Int && String) &: Boolean + +scala> def foo: Int && (Boolean &: String) = ??? +foo: Int && (Boolean &: String) + +scala> :quit diff --git a/test/files/run/t4700.scala b/test/files/run/t4700.scala new file mode 100644 index 0000000000..7c02676e89 --- /dev/null +++ b/test/files/run/t4700.scala @@ -0,0 +1,22 @@ +import scala.tools.nsc.interpreter._ +import scala.tools.partest.ReplTest + +object Test extends ReplTest { + def code = """ + |import scala.annotation.showAsInfix + |class &&[T,U] + |def foo: Int && Boolean = ??? + |def foo: Int && Boolean && String = ??? + |def foo: Int && (Boolean && String) = ??? + |@showAsInfix type Mappy[T, U] = Map[T, U] + |def foo: Int Mappy (Boolean && String) = ??? + |@showAsInfix(false) class ||[T,U] + |def foo: Int || Boolean = ??? + |class &:[L, R] + |def foo: Int &: String = ??? + |def foo: Int &: Boolean &: String = ??? + |def foo: (Int && String) &: Boolean = ??? + |def foo: Int && (Boolean &: String) = ??? + |""".stripMargin +} + diff --git a/test/files/run/t4788-separate-compilation.check b/test/files/run/t4788-separate-compilation.check index 172ad90102..618fddfea3 100644 --- a/test/files/run/t4788-separate-compilation.check +++ b/test/files/run/t4788-separate-compilation.check @@ -1,5 +1,5 @@ Some(@Ljava/lang/Deprecated;()) None -None -Some(@LCAnnotation;() // invisible) +Some(@LSAnnotation;()) +Some(@LCAnnotation;()) Some(@LRAnnotation;()) diff --git a/test/files/run/t4788.check b/test/files/run/t4788.check index 172ad90102..618fddfea3 100644 --- a/test/files/run/t4788.check +++ b/test/files/run/t4788.check @@ -1,5 +1,5 @@ Some(@Ljava/lang/Deprecated;()) None -None -Some(@LCAnnotation;() // invisible) +Some(@LSAnnotation;()) +Some(@LCAnnotation;()) Some(@LRAnnotation;()) diff --git a/test/files/run/t5907.scala b/test/files/run/t5907.scala index a005e9fbd3..81fc43e3f5 100644 --- a/test/files/run/t5907.scala +++ b/test/files/run/t5907.scala @@ -86,7 +86,7 @@ object Test extends App { } } -case class C1(implicit x: Int) { +case class C1()(implicit x: Int) { override def toString = s"c1: $x" } case class C2()(y: Int) { diff --git a/test/files/run/t6240a/StepOne.java b/test/files/run/t6240a/StepOne.java index 342d617c79..a9c076c000 100644 --- a/test/files/run/t6240a/StepOne.java +++ b/test/files/run/t6240a/StepOne.java @@ -31,7 +31,7 @@ public class StepOne { // launch StepTwo URL[] launchURLs = new URL[launchPaths.length]; for (int i = 0; i < launchPaths.length; i++) { - launchURLs[i] = new File(launchPaths[i]).toURL(); + launchURLs[i] = new File(launchPaths[i]).toURI().toURL(); } URLClassLoader classLoader = new URLClassLoader(launchURLs, Object.class.getClassLoader()); Class<?> stepTwo = classLoader.loadClass("StepTwo"); diff --git a/test/files/run/t6240b/StepOne.java b/test/files/run/t6240b/StepOne.java index 342d617c79..a9c076c000 100644 --- a/test/files/run/t6240b/StepOne.java +++ b/test/files/run/t6240b/StepOne.java @@ -31,7 +31,7 @@ public class StepOne { // launch StepTwo URL[] launchURLs = new URL[launchPaths.length]; for (int i = 0; i < launchPaths.length; i++) { - launchURLs[i] = new File(launchPaths[i]).toURL(); + launchURLs[i] = new File(launchPaths[i]).toURI().toURL(); } URLClassLoader classLoader = new URLClassLoader(launchURLs, Object.class.getClassLoader()); Class<?> stepTwo = classLoader.loadClass("StepTwo"); diff --git a/test/files/run/t7582.check b/test/files/run/t7582.check index 58d0f19f5d..d0a0975d4c 100644 --- a/test/files/run/t7582.check +++ b/test/files/run/t7582.check @@ -1,5 +1,5 @@ -InlineHolder.scala:9: warning: p1/InlineHolder$::inlinable()I is annotated @inline but could not be inlined: -The callee p1/InlineHolder$::inlinable()I contains the instruction INVOKESTATIC p1/PackageProtectedJava.protectedMethod ()I +InlineHolder_2.scala:9: warning: p1/InlineHolder$::inlinable()I is annotated @inline but could not be inlined: +The callee p1/InlineHolder$::inlinable()I contains the instruction INVOKESTATIC p1/PackageProtectedJava_1.protectedMethod ()I that would cause an IllegalAccessError when inlined into class O$. def x = p1.InlineHolder.inlinable ^ diff --git a/test/files/run/t7582b/InlineHolder.scala b/test/files/run/t7582/InlineHolder_2.scala index a18b9effaa..44c68d49b9 100644 --- a/test/files/run/t7582b/InlineHolder.scala +++ b/test/files/run/t7582/InlineHolder_2.scala @@ -1,6 +1,6 @@ package p1 { object InlineHolder { - @inline def inlinable = p1.PackageProtectedJava.protectedMethod() + 1 + @inline def inlinable = p1.PackageProtectedJava_1.protectedMethod() + 1 } } diff --git a/test/files/run/t7582/PackageProtectedJava.java b/test/files/run/t7582/PackageProtectedJava_1.java index b7ea2a7676..a3a957dad8 100644 --- a/test/files/run/t7582/PackageProtectedJava.java +++ b/test/files/run/t7582/PackageProtectedJava_1.java @@ -1,6 +1,6 @@ package p1; // public class, protected method -public class PackageProtectedJava { +public class PackageProtectedJava_1 { static final int protectedMethod() { return 1; } } diff --git a/test/files/run/t7582b.check b/test/files/run/t7582b.check index 58d0f19f5d..d0a0975d4c 100644 --- a/test/files/run/t7582b.check +++ b/test/files/run/t7582b.check @@ -1,5 +1,5 @@ -InlineHolder.scala:9: warning: p1/InlineHolder$::inlinable()I is annotated @inline but could not be inlined: -The callee p1/InlineHolder$::inlinable()I contains the instruction INVOKESTATIC p1/PackageProtectedJava.protectedMethod ()I +InlineHolder_2.scala:9: warning: p1/InlineHolder$::inlinable()I is annotated @inline but could not be inlined: +The callee p1/InlineHolder$::inlinable()I contains the instruction INVOKESTATIC p1/PackageProtectedJava_1.protectedMethod ()I that would cause an IllegalAccessError when inlined into class O$. def x = p1.InlineHolder.inlinable ^ diff --git a/test/files/run/t7582/InlineHolder.scala b/test/files/run/t7582b/InlineHolder_2.scala index a18b9effaa..44c68d49b9 100644 --- a/test/files/run/t7582/InlineHolder.scala +++ b/test/files/run/t7582b/InlineHolder_2.scala @@ -1,6 +1,6 @@ package p1 { object InlineHolder { - @inline def inlinable = p1.PackageProtectedJava.protectedMethod() + 1 + @inline def inlinable = p1.PackageProtectedJava_1.protectedMethod() + 1 } } diff --git a/test/files/run/t7582b/PackageProtectedJava.java b/test/files/run/t7582b/PackageProtectedJava_1.java index 55a44b79f9..42a2019b91 100644 --- a/test/files/run/t7582b/PackageProtectedJava.java +++ b/test/files/run/t7582b/PackageProtectedJava_1.java @@ -1,6 +1,6 @@ package p1; // protected class, public method -class PackageProtectedJava { +class PackageProtectedJava_1 { public static final int protectedMethod() { return 1; } } diff --git a/test/files/run/t9013/Test.java b/test/files/run/t9013/Test.java new file mode 100644 index 0000000000..14152b16ac --- /dev/null +++ b/test/files/run/t9013/Test.java @@ -0,0 +1,20 @@ +import java.util.Comparator; + +public class Test { + public static void main(String[] args) { + ClassImplementsClass c = new ClassImplementsClass(); + + c.x("a", "b", "c"); + c.y("a", "b", "c"); + c.z("a", "b", "c"); + + VarargAbstractClass i = new ClassImplementsClass(); + + i.x("a", "b", "c"); + i.y("a", "b", "c"); + // System.out.println(i.z("a", "b", "c")); // still incurs a LinkageError. + // Perhaps due to Uncurry: + // > for every repeated Java parameter `x: T...' --> x: Array[T], except: + // > if T is an unbounded abstract type, replace --> x: Array[Object] + } +} diff --git a/test/files/run/t9013/test.scala b/test/files/run/t9013/test.scala new file mode 100644 index 0000000000..073f8d086f --- /dev/null +++ b/test/files/run/t9013/test.scala @@ -0,0 +1,18 @@ +import scala.annotation.varargs + +abstract class VarargAbstractClass[T] { + @varargs + def x(els: String*): Int + + @varargs + def y(els: String*): Int + + @varargs + def z(els: T*): Int +} +class ClassImplementsClass extends VarargAbstractClass[String] { + + override def x(els: String*): Int = els.length + override def y(els: String*): Int = els.length + override def z(els: String*): Int = els.length +} diff --git a/test/files/run/t9114.scala b/test/files/run/t9114.scala new file mode 100644 index 0000000000..656a5c7d8d --- /dev/null +++ b/test/files/run/t9114.scala @@ -0,0 +1,31 @@ +import annotation.unchecked + +class Test { + trait Two[A, B] + type One[A] = Two[A,A] + class View extends One[Any] + + def checkAny(x: Some[One[Any]]) = x match { // okay + case Some(_: View) => true + case _ => false + } + def checkAbstract[A](x: Some[One[A]]) = x match { // okay + case Some(_: View) => true + case _ => false + } + + def checkExistential(x: Some[One[_]]) = x match { + case Some(_: View) => true // compiler crash + case _ => false + } +} + +object Test { + def main(args: Array[String]): Unit = { + val t1 = new Test + val t2 = new Test + assert(t1.checkAny(Some(new t1.View))) + assert(t1.checkAbstract(Some(new t1.View))) + assert(t1.checkExistential(Some(new t1.View))) + } +} diff --git a/test/files/run/trailing-commas.check b/test/files/run/trailing-commas.check new file mode 100644 index 0000000000..0dc4335ccd --- /dev/null +++ b/test/files/run/trailing-commas.check @@ -0,0 +1,9 @@ + +scala> // test varargs in patterns + +scala> val List(x, y, _*, +) = 42 :: 17 :: Nil +x: Int = 42 +y: Int = 17 + +scala> :quit diff --git a/test/files/run/trailing-commas.scala b/test/files/run/trailing-commas.scala new file mode 100644 index 0000000000..6a7f1bb55f --- /dev/null +++ b/test/files/run/trailing-commas.scala @@ -0,0 +1,7 @@ +object Test extends scala.tools.partest.ReplTest { + def code = """ +// test varargs in patterns +val List(x, y, _*, +) = 42 :: 17 :: Nil +""" +} diff --git a/test/files/scalacheck/CheckCollections.scala b/test/files/scalacheck/CheckCollections.scala deleted file mode 100644 index 329d505b47..0000000000 --- a/test/files/scalacheck/CheckCollections.scala +++ /dev/null @@ -1,52 +0,0 @@ -import org.scalacheck.Properties -import org.scalacheck.Prop._ - -import scala.reflect.internal.util.Collections._ - -object Test extends Properties("reflect.internal.util.Collections") { - def map2ConserveOld[A <: AnyRef, B](xs: List[A], ys: List[B])(f: (A, B) => A): List[A] = - if (xs.isEmpty || ys.isEmpty) xs - else { - val x1 = f(xs.head, ys.head) - val xs1 = map2Conserve(xs.tail, ys.tail)(f) - if ((x1 eq xs.head) && (xs1 eq xs.tail)) xs - else x1 :: xs1 - } - - val testfun: (String, Int) => String = { case(x, y) => - x.toLowerCase + y.toString - } - val testid: (String, Int) => String = { case (x, y) => x } - - val prop1_map2Conserve = forAll { (xs: List[String], ys: List[Int]) => - val res = map2Conserve(xs, ys)(testid) - res eq xs - } - - val prop2_map2Conserve = forAll { (xs: List[String], ys: List[Int]) => - map2Conserve(xs, ys)(testid) == map2ConserveOld(xs, ys)(testid) && - map2Conserve(xs, ys)(testfun) == map2ConserveOld(xs, ys)(testfun) - } - - def checkStackOverflow() { - var xs: List[String] = Nil - var ys: List[Int] = Nil - for (i <- 0 until 250000) { - xs = "X" :: xs - ys = 1 :: ys - } - map2Conserve(xs, ys){ case(x, y) => x.toLowerCase + y.toString } - } - - - val tests = List( - ("map2Conserve(identity)", prop1_map2Conserve), - ("map2Conserve == old impl", prop2_map2Conserve) - ) - - checkStackOverflow() - - for { - (label, prop) <- tests - } property(label) = prop -} diff --git a/test/files/scalacheck/CheckEither.scala b/test/files/scalacheck/CheckEither.scala deleted file mode 100644 index f0ec797045..0000000000 --- a/test/files/scalacheck/CheckEither.scala +++ /dev/null @@ -1,243 +0,0 @@ -import org.scalacheck.{ Arbitrary, Prop, Properties } -import org.scalacheck.Arbitrary.{arbitrary, arbThrowable} -import org.scalacheck.Gen.oneOf -import org.scalacheck.Prop._ -import org.scalacheck.Test.check -import Function.tupled - -object Test extends Properties("Either") { - implicit def arbitraryEither[X, Y](implicit xa: Arbitrary[X], ya: Arbitrary[Y]): Arbitrary[Either[X, Y]] = - Arbitrary[Either[X, Y]](oneOf(arbitrary[X].map(Left(_)), arbitrary[Y].map(Right(_)))) - - val prop_either1 = forAll((n: Int) => Left(n).fold(x => x, b => sys.error("fail")) == n) - - val prop_either2 = forAll((n: Int) => Right(n).fold(a => sys.error("fail"), x => x) == n) - - val prop_swap = forAll((e: Either[Int, Int]) => e match { - case Left(a) => e.swap.right.get == a - case Right(b) => e.swap.left.get == b - }) - - val prop_isLeftRight = forAll((e: Either[Int, Int]) => e.isLeft != e.isRight) - - object CheckLeftProjection { - val prop_value = forAll((n: Int) => Left(n).left.get == n) - - val prop_getOrElse = forAll((e: Either[Int, Int], or: Int) => e.left.getOrElse(or) == (e match { - case Left(a) => a - case Right(_) => or - })) - - val prop_forall = forAll((e: Either[Int, Int]) => - e.left.forall(_ % 2 == 0) == (e.isRight || e.left.get % 2 == 0)) - - val prop_exists = forAll((e: Either[Int, Int]) => - e.left.exists(_ % 2 == 0) == (e.isLeft && e.left.get % 2 == 0)) - - val prop_flatMapLeftIdentity = forAll((e: Either[Int, Int], n: Int, s: String) => { - def f(x: Int) = if(x % 2 == 0) Left(s) else Right(s) - Left(n).left.flatMap(f(_)) == f(n)}) - - val prop_flatMapRightIdentity = forAll((e: Either[Int, Int]) => e.left.flatMap(Left(_)) == e) - - val prop_flatMapComposition = forAll((e: Either[Int, Int]) => { - def f(x: Int) = if(x % 2 == 0) Left(x) else Right(x) - def g(x: Int) = if(x % 7 == 0) Right(x) else Left(x) - e.left.flatMap(f(_)).left.flatMap(g(_)) == e.left.flatMap(f(_).left.flatMap(g(_)))}) - - val prop_mapIdentity = forAll((e: Either[Int, Int]) => e.left.map(x => x) == e) - - val prop_mapComposition = forAll((e: Either[String, Int]) => { - def f(s: String) = s.toLowerCase - def g(s: String) = s.reverse - e.left.map(x => f(g(x))) == e.left.map(x => g(x)).left.map(f(_))}) - - val prop_filter = forAll((e: Either[Int, Int], x: Int) => e.left.filter(_ % 2 == 0) == - (if(e.isRight || e.left.get % 2 != 0) None else Some(e))) - - val prop_seq = forAll((e: Either[Int, Int]) => e.left.toSeq == (e match { - case Left(a) => Seq(a) - case Right(_) => Seq.empty - })) - - val prop_option = forAll((e: Either[Int, Int]) => e.left.toOption == (e match { - case Left(a) => Some(a) - case Right(_) => None - })) - } - - object CheckRightProjection { - val prop_value = forAll((n: Int) => Right(n).right.get == n) - - val prop_getOrElse = forAll((e: Either[Int, Int], or: Int) => e.right.getOrElse(or) == (e match { - case Left(_) => or - case Right(b) => b - })) - - val prop_forall = forAll((e: Either[Int, Int]) => - e.right.forall(_ % 2 == 0) == (e.isLeft || e.right.get % 2 == 0)) - - val prop_exists = forAll((e: Either[Int, Int]) => - e.right.exists(_ % 2 == 0) == (e.isRight && e.right.get % 2 == 0)) - - val prop_flatMapLeftIdentity = forAll((e: Either[Int, Int], n: Int, s: String) => { - def f(x: Int) = if(x % 2 == 0) Left(s) else Right(s) - Right(n).right.flatMap(f(_)) == f(n)}) - - val prop_flatMapRightIdentity = forAll((e: Either[Int, Int]) => e.right.flatMap(Right(_)) == e) - - val prop_flatMapComposition = forAll((e: Either[Int, Int]) => { - def f(x: Int) = if(x % 2 == 0) Left(x) else Right(x) - def g(x: Int) = if(x % 7 == 0) Right(x) else Left(x) - e.right.flatMap(f(_)).right.flatMap(g(_)) == e.right.flatMap(f(_).right.flatMap(g(_)))}) - - val prop_mapIdentity = forAll((e: Either[Int, Int]) => e.right.map(x => x) == e) - - val prop_mapComposition = forAll((e: Either[Int, String]) => { - def f(s: String) = s.toLowerCase - def g(s: String) = s.reverse - e.right.map(x => f(g(x))) == e.right.map(x => g(x)).right.map(f(_))}) - - val prop_filter = forAll((e: Either[Int, Int], x: Int) => e.right.filter(_ % 2 == 0) == - (if(e.isLeft || e.right.get % 2 != 0) None else Some(e))) - - val prop_seq = forAll((e: Either[Int, Int]) => e.right.toSeq == (e match { - case Left(_) => Seq.empty - case Right(b) => Seq(b) - })) - - val prop_option = forAll((e: Either[Int, Int]) => e.right.toOption == (e match { - case Left(_) => None - case Right(b) => Some(b) - })) - } - - val prop_Either_left = forAll((n: Int) => Left(n).left.get == n) - - val prop_Either_right = forAll((n: Int) => Right(n).right.get == n) - - val prop_Either_joinLeft = forAll((e: Either[Either[Int, Int], Int]) => e match { - case Left(ee) => e.joinLeft == ee - case Right(n) => e.joinLeft == Right(n) - }) - - val prop_Either_joinRight = forAll((e: Either[Int, Either[Int, Int]]) => e match { - case Left(n) => e.joinRight == Left(n) - case Right(ee) => e.joinRight == ee - }) - - val prop_Either_reduce = forAll((e: Either[Int, Int]) => - e.merge == (e match { - case Left(a) => a - case Right(a) => a - })) - - val prop_getOrElse = forAll((e: Either[Int, Int], or: Int) => e.getOrElse(or) == (e match { - case Left(_) => or - case Right(b) => b - })) - - val prop_contains = forAll((e: Either[Int, Int], n: Int) => - e.contains(n) == (e.isRight && e.right.get == n)) - - val prop_forall = forAll((e: Either[Int, Int]) => - e.forall(_ % 2 == 0) == (e.isLeft || e.right.get % 2 == 0)) - - val prop_exists = forAll((e: Either[Int, Int]) => - e.exists(_ % 2 == 0) == (e.isRight && e.right.get % 2 == 0)) - - val prop_flatMapLeftIdentity = forAll((e: Either[Int, Int], n: Int, s: String) => { - def f(x: Int) = if(x % 2 == 0) Left(s) else Right(s) - Right(n).flatMap(f(_)) == f(n)}) - - val prop_flatMapRightIdentity = forAll((e: Either[Int, Int]) => e.flatMap(Right(_)) == e) - - val prop_flatMapComposition = forAll((e: Either[Int, Int]) => { - def f(x: Int) = if(x % 2 == 0) Left(x) else Right(x) - def g(x: Int) = if(x % 7 == 0) Right(x) else Left(x) - e.flatMap(f(_)).flatMap(g(_)) == e.flatMap(f(_).flatMap(g(_)))}) - - val prop_mapIdentity = forAll((e: Either[Int, Int]) => e.map(x => x) == e) - - val prop_mapComposition = forAll((e: Either[Int, String]) => { - def f(s: String) = s.toLowerCase - def g(s: String) = s.reverse - e.map(x => f(g(x))) == e.map(x => g(x)).map(f(_))}) - - val prop_filterOrElse = forAll((e: Either[Int, Int], x: Int) => e.filterOrElse(_ % 2 == 0, -x) == - (if(e.isLeft) e - else if(e.right.get % 2 == 0) e - else Left(-x))) - - val prop_seq = forAll((e: Either[Int, Int]) => e.toSeq == (e match { - case Left(_) => collection.immutable.Seq.empty - case Right(b) => collection.immutable.Seq(b) - })) - - val prop_option = forAll((e: Either[Int, Int]) => e.toOption == (e match { - case Left(_) => None - case Right(b) => Some(b) - })) - - val prop_try = forAll((e: Either[Throwable, Int]) => e.toTry == (e match { - case Left(a) => util.Failure(a) - case Right(b) => util.Success(b) - })) - - /** Hard to believe I'm "fixing" a test to reflect B before A ... */ - val prop_Either_cond = forAll((c: Boolean, a: Int, b: Int) => - Either.cond(c, a, b) == (if(c) Right(a) else Left(b))) - - val tests = List( - ("prop_either1", prop_either1), - ("prop_either2", prop_either2), - ("prop_swap", prop_swap), - ("prop_isLeftRight", prop_isLeftRight), - ("Left.prop_value", CheckLeftProjection.prop_value), - ("Left.prop_getOrElse", CheckLeftProjection.prop_getOrElse), - ("Left.prop_forall", CheckLeftProjection.prop_forall), - ("Left.prop_exists", CheckLeftProjection.prop_exists), - ("Left.prop_flatMapLeftIdentity", CheckLeftProjection.prop_flatMapLeftIdentity), - ("Left.prop_flatMapRightIdentity", CheckLeftProjection.prop_flatMapRightIdentity), - ("Left.prop_flatMapComposition", CheckLeftProjection.prop_flatMapComposition), - ("Left.prop_mapIdentity", CheckLeftProjection.prop_mapIdentity), - ("Left.prop_mapComposition", CheckLeftProjection.prop_mapComposition), - ("Left.prop_filter", CheckLeftProjection.prop_filter), - ("Left.prop_seq", CheckLeftProjection.prop_seq), - ("Left.prop_option", CheckLeftProjection.prop_option), - ("Right.prop_value", CheckRightProjection.prop_value), - ("Right.prop_getOrElse", CheckRightProjection.prop_getOrElse), - ("Right.prop_forall", CheckRightProjection.prop_forall), - ("Right.prop_exists", CheckRightProjection.prop_exists), - ("Right.prop_flatMapLeftIdentity", CheckRightProjection.prop_flatMapLeftIdentity), - ("Right.prop_flatMapRightIdentity", CheckRightProjection.prop_flatMapRightIdentity), - ("Right.prop_flatMapComposition", CheckRightProjection.prop_flatMapComposition), - ("Right.prop_mapIdentity", CheckRightProjection.prop_mapIdentity), - ("Right.prop_mapComposition", CheckRightProjection.prop_mapComposition), - ("Right.prop_filter", CheckRightProjection.prop_filter), - ("Right.prop_seq", CheckRightProjection.prop_seq), - ("Right.prop_option", CheckRightProjection.prop_option), - ("prop_Either_left", prop_Either_left), - ("prop_Either_right", prop_Either_right), - ("prop_Either_joinLeft", prop_Either_joinLeft), - ("prop_Either_joinRight", prop_Either_joinRight), - ("prop_Either_reduce", prop_Either_reduce), - ("prop_getOrElse", prop_getOrElse), - ("prop_contains", prop_contains), - ("prop_forall", prop_forall), - ("prop_exists", prop_exists), - ("prop_flatMapLeftIdentity", prop_flatMapLeftIdentity), - ("prop_flatMapRightIdentity", prop_flatMapRightIdentity), - ("prop_flatMapComposition", prop_flatMapComposition), - ("prop_mapIdentity", prop_mapIdentity), - ("prop_mapComposition", prop_mapComposition), - ("prop_filterOrElse", prop_filterOrElse), - ("prop_seq", prop_seq), - ("prop_option", prop_option), - ("prop_try", prop_try), - ("prop_Either_cond", prop_Either_cond)) - - for ((label, prop) <- tests) { - property(label) = prop - } -} diff --git a/test/files/scalacheck/Ctrie.scala b/test/files/scalacheck/Ctrie.scala deleted file mode 100644 index eef9d06f37..0000000000 --- a/test/files/scalacheck/Ctrie.scala +++ /dev/null @@ -1,218 +0,0 @@ - - - -import org.scalacheck._ -import Prop._ -import org.scalacheck.Gen._ -import collection._ -import collection.concurrent.TrieMap - - - -case class Wrap(i: Int) { - override def hashCode = i // * 0x9e3775cd -} - - -/** A check mainly oriented towards checking snapshot correctness. - */ -object Test extends Properties("concurrent.TrieMap") { - - /* generators */ - - val sizes = choose(0, 200000) - - val threadCounts = choose(2, 16) - - val threadCountsAndSizes = for { - p <- threadCounts - sz <- sizes - } yield (p, sz); - - - /* helpers */ - - def inParallel[T](totalThreads: Int)(body: Int => T): Seq[T] = { - val threads = for (idx <- 0 until totalThreads) yield new Thread { - setName("ParThread-" + idx) - private var res: T = _ - override def run() { - res = body(idx) - } - def result = { - this.join() - res - } - } - - threads foreach (_.start()) - threads map (_.result) - } - - def spawn[T](body: =>T): { def get: T } = { - val t = new Thread { - setName("SpawnThread") - private var res: T = _ - override def run() { - res = body - } - def result = res - } - t.start() - new { - def get: T = { - t.join() - t.result - } - } - } - - def elementRange(threadIdx: Int, totalThreads: Int, totalElems: Int): Range = { - val sz = totalElems - val idx = threadIdx - val p = totalThreads - val start = (sz / p) * idx + math.min(idx, sz % p) - val elems = (sz / p) + (if (idx < sz % p) 1 else 0) - val end = start + elems - (start until end) - } - - def hasGrown[K, V](last: Map[K, V], current: Map[K, V]) = { - (last.size <= current.size) && { - last forall { - case (k, v) => current.get(k) == Some(v) - } - } - } - - object err { - var buffer = new StringBuilder - def println(a: AnyRef) = buffer.append(a.toString).append("\n") - def clear() = buffer.clear() - def flush() = { - Console.out.println(buffer) - clear() - } - } - - - /* properties */ - - property("concurrent growing snapshots") = forAll(threadCounts, sizes) { - (numThreads, numElems) => - val p = 3 //numThreads - val sz = 102 //numElems - val ct = new TrieMap[Wrap, Int] - - // checker - val checker = spawn { - def check(last: Map[Wrap, Int], iterationsLeft: Int): Boolean = { - val current = ct.readOnlySnapshot() - if (!hasGrown(last, current)) false - else if (current.size >= sz) true - else if (iterationsLeft < 0) false - else check(current, iterationsLeft - 1) - } - check(ct.readOnlySnapshot(), 500) - } - - // fillers - inParallel(p) { - idx => - elementRange(idx, p, sz) foreach (i => ct.update(Wrap(i), i)) - } - - // wait for checker to finish - val growing = true//checker.get - - val ok = growing && ((0 until sz) forall { - case i => ct.get(Wrap(i)) == Some(i) - }) - - ok - } - - property("update") = forAll(sizes) { - (n: Int) => - val ct = new TrieMap[Int, Int] - for (i <- 0 until n) ct(i) = i - (0 until n) forall { - case i => ct(i) == i - } - } - - property("concurrent update") = forAll(threadCountsAndSizes) { - case (p, sz) => - val ct = new TrieMap[Wrap, Int] - - inParallel(p) { - idx => - for (i <- elementRange(idx, p, sz)) ct(Wrap(i)) = i - } - - (0 until sz) forall { - case i => ct(Wrap(i)) == i - } - } - - - property("concurrent remove") = forAll(threadCounts, sizes) { - (p, sz) => - val ct = new TrieMap[Wrap, Int] - for (i <- 0 until sz) ct(Wrap(i)) = i - - inParallel(p) { - idx => - for (i <- elementRange(idx, p, sz)) ct.remove(Wrap(i)) - } - - (0 until sz) forall { - case i => ct.get(Wrap(i)) == None - } - } - - - property("concurrent putIfAbsent") = forAll(threadCounts, sizes) { - (p, sz) => - val ct = new TrieMap[Wrap, Int] - - val results = inParallel(p) { - idx => - elementRange(idx, p, sz) find (i => ct.putIfAbsent(Wrap(i), i) != None) - } - - (results forall (_ == None)) && ((0 until sz) forall { - case i => ct.get(Wrap(i)) == Some(i) - }) - } - - property("concurrent getOrElseUpdate") = forAll(threadCounts, sizes) { - (p, sz) => - val totalInserts = new java.util.concurrent.atomic.AtomicInteger - val ct = new TrieMap[Wrap, String] - - val results = inParallel(p) { - idx => - (0 until sz) foreach { - i => - val v = ct.getOrElseUpdate(Wrap(i), idx + ":" + i) - if (v == idx + ":" + i) totalInserts.incrementAndGet() - } - } - - (totalInserts.get == sz) && ((0 until sz) forall { - case i => ct(Wrap(i)).split(":")(1).toInt == i - }) - } - -} - - - - - - - - - - diff --git a/test/files/scalacheck/MutablePriorityQueue.scala b/test/files/scalacheck/MutablePriorityQueue.scala deleted file mode 100644 index 687e2e7c62..0000000000 --- a/test/files/scalacheck/MutablePriorityQueue.scala +++ /dev/null @@ -1,102 +0,0 @@ -import scala.collection.mutable.PriorityQueue -import org.scalacheck._ -import Prop._ -import Arbitrary._ - -object Test extends Properties("PriorityQueue") { - type E = Int // the element type used for most/all of the tests - - def checkInvariant[A](pq: PriorityQueue[A])(implicit ord: Ordering[A]): Boolean = { - // The ordering invariant in the heap is that parent >= child. - // A child at index i has a parent at index i/2 in the priority - // queue's internal array. However, that array is padded with - // an extra slot in front so that the first real element is at - // index 1. The vector below is not padded, so subtract 1 from - // every index. - import ord._ - val vec = pq.toVector // elements in same order as pq's internal array - 2 until pq.size forall { i => vec(i/2-1) >= vec(i-1) } - } - - property("newBuilder (in companion)") = forAll { list: List[E] => - val builder = PriorityQueue.newBuilder[E] - for (x <- list) builder += x - val pq = builder.result() - checkInvariant(pq) && - pq.dequeueAll == list.sorted.reverse - } - - property("to[PriorityQueue]") = forAll { list: List[E] => - val pq = list.to[PriorityQueue] - checkInvariant(pq) && - pq.dequeueAll == list.sorted.reverse - } - - property("apply (in companion)") = forAll { list: List[E] => - val pq = PriorityQueue.apply(list : _*) - checkInvariant(pq) && - pq.dequeueAll == list.sorted.reverse - } - - property("size, isEmpty") = forAll { list: List[E] => - val pq = PriorityQueue(list : _*) - pq.size == list.size && pq.isEmpty == list.isEmpty - } - - property("+=") = forAll { (x: E, list: List[E]) => - val pq = PriorityQueue(list : _*) - pq += x - checkInvariant(pq) && - pq.dequeueAll == (x :: list).sorted.reverse - } - - property("++= on empty") = forAll { list: List[E] => - val pq = PriorityQueue.empty[E] - pq ++= list - checkInvariant(pq) && - pq.dequeueAll == list.sorted.reverse - } - - property("++=") = forAll { (list1: List[E], list2: List[E]) => - val pq = PriorityQueue(list1 : _*) - pq ++= list2 - checkInvariant(pq) && - pq.dequeueAll == (list1 ++ list2).sorted.reverse - } - - property("reverse") = forAll { list: List[E] => - val pq = PriorityQueue(list : _*).reverse - checkInvariant(pq)(implicitly[Ordering[E]].reverse) && - pq.dequeueAll == list.sorted - } - - property("reverse then ++=") = forAll { list: List[E] => - val pq = PriorityQueue.empty[E].reverse ++= list - checkInvariant(pq)(implicitly[Ordering[E]].reverse) && - pq.dequeueAll == list.sorted - } - - property("reverse then +=") = forAll { (x: E, list: List[E]) => - val pq = PriorityQueue(list : _*).reverse += x - checkInvariant(pq)(implicitly[Ordering[E]].reverse) && - pq.dequeueAll == (x +: list).sorted - } - - property("clone") = forAll { list: List[E] => - val pq = PriorityQueue(list : _*) - val c = pq.clone() - (pq ne c) && - checkInvariant(c) && - c.dequeueAll == pq.dequeueAll - } - - property("dequeue") = forAll { list: List[E] => - list.nonEmpty ==> { - val pq = PriorityQueue(list : _*) - val x = pq.dequeue() - checkInvariant(pq) && - x == list.max && pq.dequeueAll == list.sorted.reverse.tail - } - } - -} diff --git a/test/files/scalacheck/MutableTreeMap.scala b/test/files/scalacheck/MutableTreeMap.scala deleted file mode 100644 index 42b88c56a7..0000000000 --- a/test/files/scalacheck/MutableTreeMap.scala +++ /dev/null @@ -1,345 +0,0 @@ -import java.io._ - -import org.scalacheck._ -import org.scalacheck.Arbitrary._ -import org.scalacheck.Prop.forAll - -import scala.collection.generic.CanBuildFrom -import scala.collection.immutable -import scala.collection.mutable -import scala.util.Try -import scala.collection.mutable.{RedBlackTree => RB} - -package scala.collection.mutable { - - trait Generators { - - def genRedBlackTree[A: Arbitrary: Ordering, B: Arbitrary]: Gen[RB.Tree[A, B]] = { - import org.scalacheck.Gen._ - for { entries <- listOf(arbitrary[(A, B)]) } yield { - val tree = RB.Tree.empty[A, B] - entries.foreach { case (k, v) => RB.insert(tree, k, v) } - tree - } - } - - // Note: in scalacheck 1.12.2 tree maps can be automatically generated without the need for custom - // machinery - def genTreeMap[A: Arbitrary: Ordering, B: Arbitrary]: Gen[mutable.TreeMap[A, B]] = { - import org.scalacheck.Gen._ - for { - keys <- listOf(arbitrary[A]) - values <- listOfN(keys.size, arbitrary[B]) - } yield mutable.TreeMap(keys zip values: _*) - } - - implicit def arbRedBlackTree[A: Arbitrary: Ordering, B: Arbitrary] = Arbitrary(genRedBlackTree[A, B]) - implicit def arbTreeMap[A: Arbitrary: Ordering, B: Arbitrary] = Arbitrary(genTreeMap[A, B]) - } - - object RedBlackTreeProperties extends Properties("mutable.RedBlackTree") with Generators { - type K = String - type V = Int - - property("initial invariants") = forAll { (tree: RB.Tree[K, V]) => - RB.isValid(tree) - } - - property("insert") = forAll { (tree: RB.Tree[K, V], entries: Seq[(K, V)]) => - entries.foreach { case (k, v) => RB.insert(tree, k, v) } - RB.isValid(tree) && entries.toMap.forall { case (k, v) => RB.get(tree, k) == Some(v) } - } - - property("delete") = forAll { (tree: RB.Tree[K, V], ks: Seq[K]) => - ks.foreach { k => RB.delete(tree, k) } - RB.isValid(tree) && ks.toSet.forall { k => RB.get(tree, k) == None } - } - - property("insert & delete") = forAll { (tree: RB.Tree[K, V], ops: Seq[Either[(K, V), K]]) => - ops.foreach { - case Left((k, v)) => RB.insert(tree, k, v) - case Right(k) => RB.delete(tree, k) - } - RB.isValid(tree) - } - - property("min") = forAll { (entries: Seq[(K, V)]) => - val tree = RB.Tree.empty[K, V] - entries.foreach { case (k, v) => RB.insert(tree, k, v) } - RB.min(tree) == (if (entries.isEmpty) None else Some(entries.toMap.min)) - } - - property("max") = forAll { (entries: Seq[(K, V)]) => - val tree = RB.Tree.empty[K, V] - entries.foreach { case (k, v) => RB.insert(tree, k, v) } - RB.max(tree) == (if (entries.isEmpty) None else Some(entries.toMap.max)) - } - } - - object MutableTreeMapProperties extends Properties("mutable.TreeMap") with Generators { - type K = String - type V = Int - - property("get, contains") = forAll { (allEntries: Map[K, V]) => - val entries = allEntries.take(allEntries.size / 2) - - val map = mutable.TreeMap[K, V]() - map ++= entries - - allEntries.forall { case (k, v) => - map.contains(k) == entries.contains(k) && - map.get(k) == entries.get(k) - } - } - - property("size, isEmpty") = forAll { (entries: Map[K, V]) => - val map = mutable.TreeMap[K, V]() - map ++= entries - map.size == entries.size && map.isEmpty == entries.isEmpty - } - - property("+=") = forAll { (map: mutable.TreeMap[K, V], k: K, v: V) => - val oldSize = map.size - val containedKeyBefore = map.contains(k) - val newExpectedSize = if(containedKeyBefore) oldSize else oldSize + 1 - - map += (k -> v) - map.contains(k) && map.get(k) == Some(v) && map.size == newExpectedSize - } - - property("++=") = forAll { (map: mutable.TreeMap[K, V], entries: Seq[(K, V)]) => - val oldEntries = map.toMap - map ++= entries - (oldEntries ++ entries).forall { case (k, v) => map.get(k) == Some(v) } - } - - property("-=") = forAll { (map: mutable.TreeMap[K, V], k: K) => - val oldSize = map.size - val containedKeyBefore = map.contains(k) - val newExpectedSize = if(containedKeyBefore) oldSize - 1 else oldSize - - map -= k - !map.contains(k) && map.get(k) == None && map.size == newExpectedSize - } - - property("--=") = forAll { (map: mutable.TreeMap[K, V], ks: Seq[K]) => - val oldElems = map.toList - map --= ks - val deletedElems = ks.toSet - oldElems.forall { case (k, v) => map.get(k) == (if(deletedElems(k)) None else Some(v)) } - } - - property("iterator") = forAll { (entries: Map[K, V]) => - val map = mutable.TreeMap[K, V]() - map ++= entries - - map.iterator.toSeq == entries.toSeq.sorted - } - - property("iteratorFrom") = forAll { (entries: Map[K, V], k: K) => - val map = mutable.TreeMap[K, V]() - map ++= entries - - map.iteratorFrom(k).toSeq == entries.filterKeys(_ >= k).toSeq.sorted - } - - property("keysIteratorFrom") = forAll { (entries: Map[K, V], k: K) => - val map = mutable.TreeMap[K, V]() - map ++= entries - - map.keysIteratorFrom(k).toSeq == entries.keysIterator.filter(_ >= k).toSeq.sorted - } - - property("valuesIteratorFrom") = forAll { (entries: Map[K, V], k: K) => - val map = mutable.TreeMap[K, V]() - map ++= entries - - map.valuesIteratorFrom(k).toSeq == entries.filterKeys(_ >= k).toSeq.sorted.map(_._2) - } - - property("headOption") = forAll { (map: mutable.TreeMap[K, V]) => - map.headOption == Try(map.iterator.next()).toOption - } - - property("lastOption") = forAll { (map: mutable.TreeMap[K, V]) => - map.lastOption == Try(map.iterator.max).toOption - } - - property("clear") = forAll { (map: mutable.TreeMap[K, V]) => - map.clear() - map.isEmpty && map.size == 0 - } - - property("serializable") = forAll { (map: mutable.TreeMap[K, V]) => - val bytesOut = new ByteArrayOutputStream() - val out = new ObjectOutputStream(bytesOut) - out.writeObject(map) - val bytes = bytesOut.toByteArray - - val in = new ObjectInputStream(new ByteArrayInputStream(bytes)) - val sameMap = in.readObject().asInstanceOf[mutable.TreeMap[K, V]] - map.iterator.toSeq == sameMap.iterator.toSeq - } - - property("same behavior as immutable.TreeMap") = forAll { ops: Seq[Either[(K, V), K]] => - var imap = immutable.TreeMap[K, V]() - val mmap = mutable.TreeMap[K, V]() - - ops.foreach { - case Left((k, v)) => imap += k -> v; mmap += k -> v - case Right(k) => imap -= k; mmap -= k - } - - imap.toList == mmap.toList - } - } - - object MutableTreeMapViewProperties extends Properties("mutable.TreeMapView") with Generators { - type K = String - type V = Int - - implicit val ord = implicitly[Ordering[K]] - - def in(key: K, from: Option[K], until: Option[K]) = - from.fold(true)(_ <= key) && until.fold(true)(_ > key) - - def entriesInView[This <: TraversableOnce[(K, V)], That](entries: This, from: Option[K], until: Option[K])(implicit bf: CanBuildFrom[This, (K, V), That]) = { - (bf.apply(entries) ++= entries.filter { case (k, _) => in(k, from, until) }).result() - } - - property("get, contains") = forAll { (allEntries: Map[K, V], from: Option[K], until: Option[K]) => - val entries = allEntries.take(allEntries.size / 2) - - val map = mutable.TreeMap[K, V]() - map ++= entries - - val mapView = map.rangeImpl(from, until) - allEntries.forall { case (k, v) => - mapView.contains(k) == (in(k, from, until) && entries.contains(k)) && - mapView.get(k) == (if(in(k, from, until)) entries.get(k) else None) - } - } - - property("size, isEmpty") = forAll { (entries: Map[K, V], from: Option[K], until: Option[K]) => - val map = mutable.TreeMap[K, V]() - map ++= entries - - val mapView = map.rangeImpl(from, until) - mapView.size == entriesInView(entries, from, until).size && - mapView.isEmpty == !entries.exists { kv => in(kv._1, from, until) } - } - - property("+=") = forAll { (map: mutable.TreeMap[K, V], k: K, v: V, from: Option[K], until: Option[K]) => - val oldSize = map.size - val containedKeyBefore = map.contains(k) - val newExpectedSize = if(containedKeyBefore) oldSize else oldSize + 1 - val isInRange = in(k, from, until) - - val mapView = map.rangeImpl(from, until) - mapView += (k -> v) - - map.contains(k) && map.get(k) == Some(v) && map.size == newExpectedSize && - mapView.contains(k) == isInRange && - mapView.get(k) == (if(isInRange) Some(v) else None) - } - - property("++=") = forAll { (map: mutable.TreeMap[K, V], entries: Seq[(K, V)], from: Option[K], until: Option[K]) => - val mapView = map.rangeImpl(from, until) - mapView ++= entries - entries.toMap.forall { case (k, v) => - map.get(k) == Some(v) && - mapView.get(k) == (if (in(k, from, until)) Some(v) else None) - } - } - - property("-=") = forAll { (map: mutable.TreeMap[K, V], k: K, from: Option[K], until: Option[K]) => - val oldSize = map.size - val containedKeyBefore = map.contains(k) - val newExpectedSize = if(containedKeyBefore) oldSize - 1 else oldSize - - val mapView = map.rangeImpl(from, until) - mapView -= k - - !map.contains(k) && map.get(k) == None && map.size == newExpectedSize && - !mapView.contains(k) && - mapView.get(k) == None - } - - property("--=") = forAll { (map: mutable.TreeMap[K, V], ks: Seq[K], from: Option[K], until: Option[K]) => - val mapView = map.rangeImpl(from, until) - mapView --= ks - ks.toSet.forall { k => map.get(k) == None && mapView.get(k) == None } - } - - property("iterator") = forAll { (entries: Map[K, V], from: Option[K], until: Option[K]) => - val map = mutable.TreeMap[K, V]() - map ++= entries - - val mapView = map.rangeImpl(from, until) - mapView.iterator.toSeq == entriesInView(entries, from, until).toSeq.sorted - } - - property("iteratorFrom") = forAll { (entries: Map[K, V], k: K, from: Option[K], until: Option[K]) => - val map = mutable.TreeMap[K, V]() - map ++= entries - - val mapView = map.rangeImpl(from, until) - val newLower = Some(from.fold(k)(ord.max(_, k))) - mapView.iteratorFrom(k).toSeq == entriesInView(entries, newLower, until).toSeq.sorted - } - - property("keysIteratorFrom") = forAll { (entries: Map[K, V], k: K, from: Option[K], until: Option[K]) => - val map = mutable.TreeMap[K, V]() - map ++= entries - - val mapView = map.rangeImpl(from, until) - val newLower = Some(from.fold(k)(ord.max(_, k))) - mapView.keysIteratorFrom(k).toSeq == entriesInView(entries, newLower, until).toSeq.sorted.map(_._1) - } - - property("valuesIteratorFrom") = forAll { (entries: Map[K, V], k: K, from: Option[K], until: Option[K]) => - val map = mutable.TreeMap[K, V]() - map ++= entries - - val mapView = map.rangeImpl(from, until) - val newLower = Some(from.fold(k)(ord.max(_, k))) - mapView.valuesIteratorFrom(k).toSeq == entriesInView(entries, newLower, until).toSeq.sorted.map(_._2) - } - - property("headOption") = forAll { (map: mutable.TreeMap[K, V], from: Option[K], until: Option[K]) => - val mapView = map.rangeImpl(from, until) - mapView.headOption == Try(entriesInView(map.iterator, from, until).next()).toOption - } - - property("lastOption") = forAll { (map: mutable.TreeMap[K, V], from: Option[K], until: Option[K]) => - val mapView = map.rangeImpl(from, until) - mapView.lastOption == Try(entriesInView(map.iterator, from, until).max).toOption - } - - property("clear") = forAll { (map: mutable.TreeMap[K, V], from: Option[K], until: Option[K]) => - val mapView = map.rangeImpl(from, until) - mapView.clear() - map.isEmpty && mapView.isEmpty && map.size == 0 && mapView.size == 0 - } - - property("serializable") = forAll { (map: mutable.TreeMap[K, V], from: Option[K], until: Option[K]) => - val mapView = map.rangeImpl(from, until) - - val bytesOut = new ByteArrayOutputStream() - val out = new ObjectOutputStream(bytesOut) - out.writeObject(mapView) - val bytes = bytesOut.toByteArray - - val in = new ObjectInputStream(new ByteArrayInputStream(bytes)) - val sameMapView = in.readObject().asInstanceOf[mutable.TreeMap[K, V]] - mapView.iterator.toSeq == sameMapView.iterator.toSeq - } - } -} - -object Test extends Properties("mutable.TreeMap") { - import scala.collection.mutable._ - include(RedBlackTreeProperties) - include(MutableTreeMapProperties) - include(MutableTreeMapViewProperties) -} diff --git a/test/files/scalacheck/MutableTreeSet.scala b/test/files/scalacheck/MutableTreeSet.scala deleted file mode 100644 index bcb1d0ed94..0000000000 --- a/test/files/scalacheck/MutableTreeSet.scala +++ /dev/null @@ -1,216 +0,0 @@ -import java.io._ - -import org.scalacheck._ -import org.scalacheck.Arbitrary._ -import org.scalacheck.Prop.forAll - -import scala.collection.generic.CanBuildFrom -import scala.collection.immutable -import scala.collection.mutable -import scala.util.Try - -package scala.collection.mutable { - - object MutableTreeSetProperties extends Properties("mutable.TreeSet") { - type K = String - - property("size, isEmpty") = forAll { (elems: Set[K]) => - val set = mutable.TreeSet[K]() - set ++= elems - set.size == elems.size && set.isEmpty == elems.isEmpty - } - - property("+=") = forAll { (set: mutable.TreeSet[K], k: K) => - val oldSize = set.size - val containedKeyBefore = set.contains(k) - val newExpectedSize = if(containedKeyBefore) oldSize else oldSize + 1 - - set += k - set.contains(k) && set.size == newExpectedSize - } - - property("++=") = forAll { (set: mutable.TreeSet[K], ks: Seq[K]) => - val oldElems = set.toList - set ++= ks - (oldElems ++ ks).forall(set.contains) - } - - property("-=") = forAll { (set: mutable.TreeSet[K], k: K) => - val oldSize = set.size - val containedKeyBefore = set.contains(k) - val newExpectedSize = if(containedKeyBefore) oldSize - 1 else oldSize - - set -= k - !set.contains(k) && set.size == newExpectedSize - } - - property("--=") = forAll { (set: mutable.TreeSet[K], ks: Seq[K]) => - val oldElems = set.toList - set --= ks - val deletedElems = ks.toSet - oldElems.forall { e => set.contains(e) == !deletedElems(e) } - } - - property("iterator") = forAll { (ks: Set[K]) => - val set = mutable.TreeSet[K]() - set ++= ks - - set.iterator.toSeq == ks.toSeq.sorted - } - - property("iteratorFrom, keysIteratorFrom") = forAll { (ks: Set[K], k: K) => - val set = mutable.TreeSet[K]() - set ++= ks - - set.iteratorFrom(k).toSeq == ks.filter(_ >= k).toSeq.sorted - set.keysIteratorFrom(k).toSeq == ks.filter(_ >= k).toSeq.sorted - } - - property("headOption") = forAll { (set: mutable.TreeSet[K]) => - set.headOption == Try(set.iterator.next()).toOption - } - - property("lastOption") = forAll { (set: mutable.TreeSet[K]) => - set.lastOption == Try(set.iterator.max).toOption - } - - property("clear") = forAll { (set: mutable.TreeSet[K]) => - set.clear() - set.isEmpty && set.size == 0 - } - - property("serializable") = forAll { (set: mutable.TreeSet[K]) => - val bytesOut = new ByteArrayOutputStream() - val out = new ObjectOutputStream(bytesOut) - out.writeObject(set) - val bytes = bytesOut.toByteArray - - val in = new ObjectInputStream(new ByteArrayInputStream(bytes)) - val sameSet = in.readObject().asInstanceOf[mutable.TreeSet[K]] - set.iterator.toSeq == sameSet.iterator.toSeq - } - - property("same behavior as immutable.TreeMap") = forAll { ops: Seq[Either[K, K]] => - var iset = immutable.TreeSet[K]() - val mset = mutable.TreeSet[K]() - - ops.foreach { - case Left(k) => iset += k; mset += k - case Right(k) => iset -= k; mset -= k - } - - iset.toList == mset.toList - } - } - - object MutableTreeSetViewProperties extends Properties("mutable.TreeSetView") { - type K = String - - implicit val ord = implicitly[Ordering[K]] - - def in(key: K, from: Option[K], until: Option[K]) = - from.fold(true)(_ <= key) && until.fold(true)(_ > key) - - def keysInView[This <: TraversableOnce[K], That](keys: This, from: Option[K], until: Option[K])(implicit bf: CanBuildFrom[This, K, That]) = { - (bf.apply(keys) ++= keys.filter(in(_, from, until))).result() - } - - property("size, isEmpty") = forAll { (keys: Set[K], from: Option[K], until: Option[K]) => - val map = mutable.TreeSet[K]() - map ++= keys - - val mapView = map.rangeImpl(from, until) - mapView.size == keysInView(keys, from, until).size && - mapView.isEmpty == !keys.exists(in(_, from, until)) - } - - property("+=") = forAll { (set: mutable.TreeSet[K], k: K, from: Option[K], until: Option[K]) => - val oldSize = set.size - val containedKeyBefore = set.contains(k) - val newExpectedSize = if(containedKeyBefore) oldSize else oldSize + 1 - val isInRange = in(k, from, until) - - val setView = set.rangeImpl(from, until) - setView += k - - set.contains(k) && set.size == newExpectedSize && setView.contains(k) == isInRange - } - - property("++=") = forAll { (set: mutable.TreeSet[K], ks: Seq[K], from: Option[K], until: Option[K]) => - val setView = set.rangeImpl(from, until) - setView ++= ks - ks.toSet.forall { k => - set.contains(k) && setView.contains(k) == in(k, from, until) - } - } - - property("-=") = forAll { (set: mutable.TreeSet[K], k: K, from: Option[K], until: Option[K]) => - val oldSize = set.size - val containedKeyBefore = set.contains(k) - val newExpectedSize = if(containedKeyBefore) oldSize - 1 else oldSize - - val setView = set.rangeImpl(from, until) - setView -= k - - !set.contains(k) && set.size == newExpectedSize && !setView.contains(k) - } - - property("--=") = forAll { (set: mutable.TreeSet[K], ks: Seq[K], from: Option[K], until: Option[K]) => - val setView = set.rangeImpl(from, until) - setView --= ks - ks.toSet.forall { k => !set.contains(k) && !setView.contains(k) } - } - - property("iterator") = forAll { (ks: Set[K], from: Option[K], until: Option[K]) => - val set = mutable.TreeSet[K]() - set ++= ks - - val setView = set.rangeImpl(from, until) - setView.iterator.toSeq == keysInView(ks, from, until).toSeq.sorted - } - - property("iteratorFrom, keysIteratorFrom") = forAll { (ks: Set[K], k: K, from: Option[K], until: Option[K]) => - val set = mutable.TreeSet[K]() - set ++= ks - - val setView = set.rangeImpl(from, until) - val newLower = Some(from.fold(k)(ord.max(_, k))) - setView.iteratorFrom(k).toSeq == keysInView(ks, newLower, until).toSeq.sorted - } - - property("headOption") = forAll { (set: mutable.TreeSet[K], from: Option[K], until: Option[K]) => - val setView = set.rangeImpl(from, until) - setView.headOption == Try(keysInView(set.iterator, from, until).next()).toOption - } - - property("lastOption") = forAll { (set: mutable.TreeSet[K], from: Option[K], until: Option[K]) => - val setView = set.rangeImpl(from, until) - setView.lastOption == Try(keysInView(set.iterator, from, until).max).toOption - } - - property("clear") = forAll { (set: mutable.TreeSet[K], from: Option[K], until: Option[K]) => - val setView = set.rangeImpl(from, until) - setView.clear() - set.isEmpty && setView.isEmpty && set.size == 0 && setView.size == 0 - } - - property("serializable") = forAll { (set: mutable.TreeSet[K], from: Option[K], until: Option[K]) => - val setView = set.rangeImpl(from, until) - - val bytesOut = new ByteArrayOutputStream() - val out = new ObjectOutputStream(bytesOut) - out.writeObject(setView) - val bytes = bytesOut.toByteArray - - val in = new ObjectInputStream(new ByteArrayInputStream(bytes)) - val sameSetView = in.readObject().asInstanceOf[mutable.TreeSet[K]] - setView.iterator.toSeq == sameSetView.iterator.toSeq - } - } -} - -object Test extends Properties("mutable.TreeSet") { - import scala.collection.mutable._ - include(MutableTreeSetProperties) - include(MutableTreeSetViewProperties) -} diff --git a/test/files/scalacheck/ReflectionExtractors.scala b/test/files/scalacheck/ReflectionExtractors.scala deleted file mode 100644 index a2615feb3e..0000000000 --- a/test/files/scalacheck/ReflectionExtractors.scala +++ /dev/null @@ -1,52 +0,0 @@ -import org.scalacheck._ -import Prop._ -import Gen._ -import Arbitrary._ - -import scala.reflect.runtime.universe._ -import Flag._ - -object Test extends Properties("reflection extractors") { - - val genFlag = oneOf( - TRAIT, INTERFACE, MUTABLE, MACRO, DEFERRED, ABSTRACT, FINAL, SEALED, - IMPLICIT, LAZY, OVERRIDE, PRIVATE, PROTECTED, LOCAL, CASE, ABSOVERRIDE, - BYNAMEPARAM, PARAM, COVARIANT, CONTRAVARIANT, DEFAULTPARAM, PRESUPER, - DEFAULTINIT - ) - val genModifiers = - for(flag <- genFlag; privateWithin <- genName) - yield Modifiers(flag, privateWithin, Nil) - val genTermName = for(name <- arbitrary[String]) yield TermName(name) - val genTypeName = for(name <- arbitrary[String]) yield TypeName(name) - val genName = oneOf(genTermName, genTypeName) - - implicit val arbTermName: Arbitrary[TermName] = Arbitrary(genTermName) - implicit val arbTypeName: Arbitrary[TypeName] = Arbitrary(genTypeName) - implicit val arbName: Arbitrary[Name] = Arbitrary(genName) - implicit val arbMods: Arbitrary[Modifiers] = Arbitrary(genModifiers) - - property("extract term name") = forAll { (name: TermName) => - val TermName(s) = name - s == name.toString - } - - property("extract type name") = forAll { (name: TypeName) => - val TypeName(s) = name - s == name.toString - } - - property("extract term or type name") = forAll { (name: Name) => - name match { - case TermName(s) => s == name.toString - case TypeName(s) => s == name.toString - } - } - - property("extract modifiers") = forAll { (mods: Modifiers) => - val Modifiers(flags, priv, annots) = mods - flags == mods.flags && - priv == mods.privateWithin && - annots == mods.annotations - } -}
\ No newline at end of file diff --git a/test/files/scalacheck/Unrolled.scala b/test/files/scalacheck/Unrolled.scala deleted file mode 100644 index 34604b8667..0000000000 --- a/test/files/scalacheck/Unrolled.scala +++ /dev/null @@ -1,26 +0,0 @@ -import org.scalacheck._ -import Prop._ -import Gen._ - -import collection.mutable.UnrolledBuffer - -object Test extends Properties("UnrolledBuffer") { - - property("concat size") = forAll { (l1: List[Int], l2: List[Int]) => - val u1 = new UnrolledBuffer[Int] - u1 ++= l1 - val u2 = new UnrolledBuffer[Int] - u2 ++= l2 - val totalsz = u1.size + u2.size - u1 concat u2 - totalsz == u1.size - } - - property("adding") = forAll { (l: List[Int]) => - val u = new UnrolledBuffer[Int] - u ++= l - u == l - } - -} - diff --git a/test/files/scalacheck/array-new.scala b/test/files/scalacheck/array-new.scala deleted file mode 100644 index d8c69ead78..0000000000 --- a/test/files/scalacheck/array-new.scala +++ /dev/null @@ -1,37 +0,0 @@ -import scala.reflect.ClassTag // new style: use ClassTag -import org.scalacheck._ -import Prop._ -import Gen._ -import Arbitrary._ -import util._ -import Buildable._ -import scala.collection.mutable.ArraySeq - -object Test extends Properties("Array") { - /** At this moment the authentic scalacheck Array Builder/Arb bits are commented out. - */ - implicit def arbArray[T](implicit a: Arbitrary[T], m: ClassTag[T]): Arbitrary[Array[T]] = - Arbitrary(containerOf[List,T](arbitrary[T]) map (_.toArray)) - - val arrGen: Gen[Array[_]] = oneOf( - arbitrary[Array[Int]], - arbitrary[Array[Array[Int]]], - arbitrary[Array[List[String]]], - arbitrary[Array[String]], - arbitrary[Array[Boolean]], - arbitrary[Array[AnyVal]] - ) - - // inspired by #1857 and #2352 - property("eq/ne") = forAll(arrGen, arrGen) { (c1, c2) => - (c1 eq c2) || (c1 ne c2) - } - - // inspired by #2299 - def smallInt = choose(1, 10) - property("ofDim") = forAll(smallInt, smallInt, smallInt) { (i1, i2, i3) => - val arr = Array.ofDim[String](i1, i2, i3) - val flattened = arr flatMap (x => x) flatMap (x => x) - flattened.length == i1 * i2 * i3 - } -}
\ No newline at end of file diff --git a/test/files/scalacheck/array-old.scala b/test/files/scalacheck/array-old.scala deleted file mode 100644 index 03c0217180..0000000000 --- a/test/files/scalacheck/array-old.scala +++ /dev/null @@ -1,37 +0,0 @@ -import org.scalacheck._ -import Prop._ -import Gen._ -import Arbitrary._ -import util._ -import Buildable._ -import scala.collection.mutable.ArraySeq - -object Test extends Properties("Array") { - /** At this moment the authentic scalacheck Array Builder/Arb bits are commented out. - */ - implicit def arbArray[T](implicit a: Arbitrary[T], m: Manifest[T]): Arbitrary[Array[T]] = - Arbitrary(containerOf[List,T](arbitrary[T]) map (_.toArray)) - - val arrGen: Gen[Array[_]] = oneOf( - arbitrary[Array[Int]], - arbitrary[Array[Array[Int]]], - arbitrary[Array[List[String]]], - arbitrary[Array[String]], - arbitrary[Array[Boolean]], - arbitrary[Array[AnyVal]] - ) - - // inspired by #1857 and #2352 - property("eq/ne") = forAll(arrGen, arrGen) { (c1, c2) => - (c1 eq c2) || (c1 ne c2) - } - - // inspired by #2299 - def smallInt = choose(1, 10) - property("ofDim") = forAll(smallInt, smallInt, smallInt) { (i1, i2, i3) => - val arr = Array.ofDim[String](i1, i2, i3) - val flattened = arr flatMap (x => x) flatMap (x => x) - flattened.length == i1 * i2 * i3 - } -} - diff --git a/test/files/scalacheck/concurrent-map.scala b/test/files/scalacheck/concurrent-map.scala deleted file mode 100755 index 7c9b8d4169..0000000000 --- a/test/files/scalacheck/concurrent-map.scala +++ /dev/null @@ -1,76 +0,0 @@ - - - -import java.util.concurrent._ -import scala.collection._ -import scala.collection.JavaConverters._ -import org.scalacheck._ -import org.scalacheck.Prop._ -import org.scalacheck.Gen._ - - - -case class Wrap(i: Int) { - override def hashCode = i * 0x9e3775cd -} - - -object Test extends Properties("concurrent.TrieMap") { - - /* generators */ - - val sizes = choose(0, 20000) - - val threadCounts = choose(2, 16) - - val threadCountsAndSizes = for { - p <- threadCounts - sz <- sizes - } yield (p, sz); - - - /* helpers */ - - def inParallel[T](totalThreads: Int)(body: Int => T): Seq[T] = { - val threads = for (idx <- 0 until totalThreads) yield new Thread { - setName("ParThread-" + idx) - private var res: T = _ - override def run() { - res = body(idx) - } - def result = { - this.join() - res - } - } - - threads foreach (_.start()) - threads map (_.result) - } - - property("concurrent getOrElseUpdate insertions") = forAll(threadCounts, sizes) { - (p, sz) => - val chm = new ConcurrentHashMap[Wrap, Int]().asScala - - val results = inParallel(p) { - idx => - for (i <- 0 until sz) yield chm.getOrElseUpdate(new Wrap(i), idx) - } - - val resultSets = for (i <- 0 until sz) yield results.map(_(i)).toSet - val largerThanOne = resultSets.zipWithIndex.find(_._1.size != 1) - val allThreadsAgreeOnWhoInserted = { - largerThanOne == None - } :| s"$p threads agree on who inserted [disagreement (differentResults, position) = $largerThanOne]" - - allThreadsAgreeOnWhoInserted - } - - -} - - - - - - diff --git a/test/files/scalacheck/duration.scala b/test/files/scalacheck/duration.scala deleted file mode 100644 index 5e93638614..0000000000 --- a/test/files/scalacheck/duration.scala +++ /dev/null @@ -1,69 +0,0 @@ -import org.scalacheck._ -import Prop._ -import Gen._ -import Arbitrary._ -import math._ -import concurrent.duration.Duration.fromNanos - -object Test extends Properties("Division of Duration by Long") { - - val weightedLong = - frequency( - 1 -> choose(-128L, 127L), - 1 -> (arbitrary[Byte] map (_.toLong << 8)), - 1 -> (arbitrary[Byte] map (_.toLong << 16)), - 1 -> (arbitrary[Byte] map (_.toLong << 24)), - 1 -> (arbitrary[Byte] map (_.toLong << 32)), - 1 -> (arbitrary[Byte] map (_.toLong << 40)), - 1 -> (arbitrary[Byte] map (_.toLong << 48)), - 1 -> (choose(-127L, 127L) map (_ << 56)) - ) - - val genTwoSmall = for { - a <- weightedLong - b <- choose(-(Long.MaxValue / max(1, abs(a))), Long.MaxValue / max(1, abs(a))) - } yield (a, b) - - val genTwoLarge = for { - a <- weightedLong - b <- arbitrary[Long] suchThat (b => (abs(b) > Long.MaxValue / max(1, abs(a)))) - } yield (a, b) - - val genClose = for { - a <- weightedLong - if a != 0 - b <- choose(Long.MaxValue / a - 10, Long.MaxValue / a + 10) - } yield (a, b) - - val genBorderline = - frequency( - 1 -> (Long.MinValue, 0L), - 1 -> (Long.MinValue, 1L), - 1 -> (Long.MinValue, -1L), - 1 -> (0L, Long.MinValue), - 1 -> (1L, Long.MinValue), - 1 -> (-1L, Long.MinValue), - 90 -> genClose - ) - - def mul(a: Long, b: Long): Long = { - (fromNanos(a) * b).toNanos - } - - property("without overflow") = forAll(genTwoSmall) { case (a, b) => - a * b == mul(a, b) - } - - property("with overflow") = forAll(genTwoLarge) { case (a, b) => - try { mul(a, b); false } catch { case _: IllegalArgumentException => true } - } - - property("on overflow edge cases") = forAll(genBorderline) { case (a, b) => - val shouldFit = - a != Long.MinValue && // must fail due to illegal duration length - (b != Long.MinValue || a == 0) && // Long factor may only be MinValue if the duration is zero, otherwise the result will be illegal - (abs(b) <= Long.MaxValue / max(1, abs(a))) // check the rest against the “safe” division method - try { mul(a, b); shouldFit } - catch { case _: IllegalArgumentException => !shouldFit } - } -} diff --git a/test/files/scalacheck/list.scala b/test/files/scalacheck/list.scala deleted file mode 100644 index 5f6de95237..0000000000 --- a/test/files/scalacheck/list.scala +++ /dev/null @@ -1,21 +0,0 @@ -import org.scalacheck._ -import Prop._ -import Gen._ - -object Test extends Properties("List") { - def sorted(xs: List[Int]) = xs sortWith (_ < _) - - property("concat size") = forAll { (l1: List[Int], l2: List[Int]) => (l1.size + l2.size) == (l1 ::: l2).size } - property("reverse") = forAll { (l1: List[Int]) => l1.reverse.reverse == l1 } - property("toSet") = forAll { (l1: List[Int]) => sorted(l1.toSet.toList) sameElements sorted(l1).distinct } - // property("flatten") = forAll { (xxs: List[List[Int]]) => xxs.flatten.length == (xxs map (_.length) sum) } - property("startsWith/take") = forAll { (xs: List[Int], count: Int) => xs startsWith (xs take count) } - property("endsWith/takeRight") = forAll { (xs: List[Int], count: Int) => xs endsWith (xs takeRight count) } - property("fill") = forAll(choose(1, 100)) { count => - forAll { (x: Int) => - val xs = List.fill(count)(x) - (xs.length == count) && (xs.distinct == List(x)) - } - } -} - diff --git a/test/files/scalacheck/nan-ordering.scala b/test/files/scalacheck/nan-ordering.scala deleted file mode 100644 index 05e97a13c9..0000000000 --- a/test/files/scalacheck/nan-ordering.scala +++ /dev/null @@ -1,130 +0,0 @@ -import org.scalacheck._ -import Gen._ -import Prop._ - -object Test extends Properties("NaN-Ordering") { - - val specFloats: Gen[Float] = oneOf( - Float.MaxValue, - Float.MinPositiveValue, - Float.MinValue, - Float.NaN, - Float.NegativeInfinity, - Float.PositiveInfinity, - -0.0f, - +0.0f - ) - - property("Float min") = forAll(specFloats, specFloats) { (d1, d2) => { - val mathmin = math.min(d1, d2) - val numericmin = d1 min d2 - mathmin == numericmin || mathmin.isNaN && numericmin.isNaN - } - } - - property("Float max") = forAll(specFloats, specFloats) { (d1, d2) => { - val mathmax = math.max(d1, d2) - val numericmax = d1 max d2 - mathmax == numericmax || mathmax.isNaN && numericmax.isNaN - } - } - - val numFloat = implicitly[Numeric[Float]] - - property("Float lt") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.lt(d1, d2) == d1 < d2 } - - property("Float lteq") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.lteq(d1, d2) == d1 <= d2 } - - property("Float gt") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.gt(d1, d2) == d1 > d2 } - - property("Float gteq") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.gteq(d1, d2) == d1 >= d2 } - - property("Float equiv") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.equiv(d1, d2) == (d1 == d2) } - - property("Float reverse.min") = forAll(specFloats, specFloats) { (d1, d2) => { - val mathmax = math.max(d1, d2) - val numericmin = numFloat.reverse.min(d1, d2) - mathmax == numericmin || mathmax.isNaN && numericmin.isNaN - } - } - - property("Float reverse.max") = forAll(specFloats, specFloats) { (d1, d2) => { - val mathmin = math.min(d1, d2) - val numericmax = numFloat.reverse.max(d1, d2) - mathmin == numericmax || mathmin.isNaN && numericmax.isNaN - } - } - - property("Float reverse.lt") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.reverse.lt(d1, d2) == d2 < d1 } - - property("Float reverse.lteq") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.reverse.lteq(d1, d2) == d2 <= d1 } - - property("Float reverse.gt") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.reverse.gt(d1, d2) == d2 > d1 } - - property("Float reverse.gteq") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.reverse.gteq(d1, d2) == d2 >= d1 } - - property("Float reverse.equiv") = forAll(specFloats, specFloats) { (d1, d2) => numFloat.reverse.equiv(d1, d2) == (d1 == d2) } - - - val specDoubles: Gen[Double] = oneOf( - Double.MaxValue, - Double.MinPositiveValue, - Double.MinValue, - Double.NaN, - Double.NegativeInfinity, - Double.PositiveInfinity, - -0.0, - +0.0 - ) - - // ticket #5104 - property("Double min") = forAll(specDoubles, specDoubles) { (d1, d2) => { - val mathmin = math.min(d1, d2) - val numericmin = d1 min d2 - mathmin == numericmin || mathmin.isNaN && numericmin.isNaN - } - } - - property("Double max") = forAll(specDoubles, specDoubles) { (d1, d2) => { - val mathmax = math.max(d1, d2) - val numericmax = d1 max d2 - mathmax == numericmax || mathmax.isNaN && numericmax.isNaN - } - } - - val numDouble = implicitly[Numeric[Double]] - - property("Double lt") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.lt(d1, d2) == d1 < d2 } - - property("Double lteq") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.lteq(d1, d2) == d1 <= d2 } - - property("Double gt") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.gt(d1, d2) == d1 > d2 } - - property("Double gteq") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.gteq(d1, d2) == d1 >= d2 } - - property("Double equiv") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.equiv(d1, d2) == (d1 == d2) } - - property("Double reverse.min") = forAll(specDoubles, specDoubles) { (d1, d2) => { - val mathmax = math.max(d1, d2) - val numericmin = numDouble.reverse.min(d1, d2) - mathmax == numericmin || mathmax.isNaN && numericmin.isNaN - } - } - - property("Double reverse.max") = forAll(specDoubles, specDoubles) { (d1, d2) => { - val mathmin = math.min(d1, d2) - val numericmax = numDouble.reverse.max(d1, d2) - mathmin == numericmax || mathmin.isNaN && numericmax.isNaN - } - } - - property("Double reverse.lt") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.reverse.lt(d1, d2) == d2 < d1 } - - property("Double reverse.lteq") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.reverse.lteq(d1, d2) == d2 <= d1 } - - property("Double reverse.gt") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.reverse.gt(d1, d2) == d2 > d1 } - - property("Double reverse.gteq") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.reverse.gteq(d1, d2) == d2 >= d1 } - - property("Double reverse.equiv") = forAll(specDoubles, specDoubles) { (d1, d2) => numDouble.reverse.equiv(d1, d2) == (d1 == d2) } -} diff --git a/test/files/scalacheck/parallel-collections/IntOperators.scala b/test/files/scalacheck/parallel-collections/IntOperators.scala deleted file mode 100644 index 4a74b91da8..0000000000 --- a/test/files/scalacheck/parallel-collections/IntOperators.scala +++ /dev/null @@ -1,129 +0,0 @@ -package scala.collection.parallel.ops - - -import scala.collection.parallel._ - - -trait IntOperators extends Operators[Int] { - def reduceOperators = List(_ + _, _ * _, math.min(_, _), math.max(_, _), _ ^ _) - def countPredicates = List( - x => true, - _ >= 0, _ < 0, _ < 50, _ < 500, _ < 5000, _ < 50000, _ % 2 == 0, _ == 99, - x => x > 50 && x < 150, - x => x > 350 && x < 550, - x => (x > 1000 && x < 1500) || (x > 400 && x < 500) - ) - def forallPredicates = List(_ >= 0, _ < 0, _ % 2 == 0, _ != 55, _ != 505, _ != 5005) - def existsPredicates = List(_ >= 0, _ < 0, _ % 2 == 0, _ == 55, _ == 505, _ == 5005) - def findPredicates = List(_ >= 0, _ % 2 == 0, _ < 0, _ == 50, _ == 500, _ == 5000) - def mapFunctions = List(-_, math.abs(_), _ % 2, _ % 3, _ % 4, _ % 150, _ % 500) - def partialMapFunctions = List({case x => -x}, { case 0 => -1; case x if x > 0 => x + 1}, {case x if x % 3 == 0 => x / 3}) - def flatMapFunctions = List( - (n: Int) => if (n < 0) List() else if (n % 2 == 0) List(1, 2, 3) else List(4, 5, 6), - (n: Int) => List[Int](), - (n: Int) => if (n == 0) List(1, 2, 3, 4, 5) else if (n < 0) List(1, 2, 3) else List() - ) - def filterPredicates = List( - _ % 2 == 0, _ % 3 == 0, - _ % 4 != 0, _ % 17 != 0, - n => n > 50 && n < 100, - _ >= 0, _ < 0, _ == 99, - _ > 500, _ > 5000, _ > 50000, - _ < 500, _ < 50, _ < -50, _ < -5e5, - x => true, x => false, - x => x % 53 == 0 && x % 17 == 0 - ) - def filterNotPredicates = filterPredicates - def partitionPredicates = filterPredicates - def takeWhilePredicates = List( - _ != 50, _ != 500, _ != 5000, _ != 50000, _ % 2 == 0, _ % 3 == 1, _ % 47 != 0, - _ < 100, _ < 1000, _ < 10000, _ < 0, - _ < -100, _ < -1000, _ > -200, _ > -50, - n => -90 < n && n < -10, - n => 50 < n && n < 550, - n => 5000 < n && n < 7500, - n => -50 < n && n < 450 - ) - def dropWhilePredicates = takeWhilePredicates - def spanPredicates = takeWhilePredicates - def foldArguments = List( - (0, _ + _), - (1, _ * _), - (Int.MinValue, math.max(_, _)), - (Int.MaxValue, math.min(_, _)) - ) - def addAllTraversables = List( - List[Int](), - List(1), - List(1, 2), - List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), - Array.fill(1000)(1).toSeq - ) - def newArray(sz: Int) = new Array[Int](sz) - def groupByFunctions = List( - _ % 2, _ % 3, _ % 5, _ % 10, _ % 154, _% 3217, - _ * 2, _ + 1 - ) -} - - -trait IntSeqOperators extends IntOperators with SeqOperators[Int] { - def segmentLengthPredicates = List( - _ % 2 == 0, _ > 0, _ >= 0, _ < 0, _ <= 0, _ > -5000, _ > 5000, _ % 541 != 0, _ < -50, _ > 500, - n => -90 < n && n < -10, n => 500 < n && n < 1500 - ) - def indexWherePredicates = List( - _ % 2 == 0, _ % 11 == 0, _ % 123 == 0, _ % 901 == 0, - _ > 0, _ >= 0, _ < 0, _ <= 0, - _ > 50, _ > 500, _ > 5000, - _ < -10, _ < -100, _ < -1000, - n => n > 50 && n < 100, - n => n * n > 1000000 && n % 111 == 0 - ) - def lastIndexWherePredicates = List( - _ % 2 == 0, _ % 17 == 0, _ % 314 == 0, _ % 1017 == 0, - _ > 0, _ >= 0, _ < 0, _ <= 0, - _ > 50, _ > 500, _ > 5000, - _ < -20, _ < -200, _ < -2000, - _ == 0, - n => n > -40 && n < 40, - n => n > -80 && n < -10, - n => n > 110 && n < 150 - ) - def reverseMapFunctions = List(-_, n => n * n, _ + 1) - def sameElementsSeqs = List( - List[Int](), - List(1), - List(1, 2, 3, 4, 5, 6, 7, 8, 9), - Array.fill(150)(1).toSeq, - Array.fill(1000)(1).toSeq - ) - def startEndSeqs = List( - Nil, - List(1), - List(1, 2, 3, 4, 5), - List(0, 1, 2, 3, 4, 5), - List(4, 5, 6, 7, 8, 9, 10), - List(4, 5, 6, 7, 8, 9, 0), - List(-4, -3, -2, -1) - ) -} - - - - - - - - - - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/IntValues.scala b/test/files/scalacheck/parallel-collections/IntValues.scala deleted file mode 100644 index cab60ead76..0000000000 --- a/test/files/scalacheck/parallel-collections/IntValues.scala +++ /dev/null @@ -1,29 +0,0 @@ -package scala.collection.parallel.ops - - - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties -import org.scalacheck.Arbitrary._ - - - - -trait IntValues { - def values = Seq( - arbitrary[Int], - arbitrary[Int] suchThat (_ >= 0), - arbitrary[Int] suchThat (_ < 0), - choose(0, 0), - choose(0, 10), - choose(0, 100), - choose(0, 1000) suchThat (_ % 2 == 0), - choose(0, 1000) suchThat (_ % 2 != 0), - choose(0, 1000) suchThat (n => (n % 2 == 0) || (n % 3 == 0)) - ) -} diff --git a/test/files/scalacheck/parallel-collections/Operators.scala b/test/files/scalacheck/parallel-collections/Operators.scala deleted file mode 100644 index 72133a5009..0000000000 --- a/test/files/scalacheck/parallel-collections/Operators.scala +++ /dev/null @@ -1,36 +0,0 @@ -package scala.collection.parallel - - - - -trait Operators[T] { - def reduceOperators: List[(T, T) => T] - def countPredicates: List[T => Boolean] - def forallPredicates: List[T => Boolean] - def existsPredicates: List[T => Boolean] - def findPredicates: List[T => Boolean] - def mapFunctions: List[T => T] - def partialMapFunctions: List[PartialFunction[T, T]] - def flatMapFunctions: List[T => Traversable[T]] - def filterPredicates: List[T => Boolean] - def filterNotPredicates: List[T => Boolean] - def partitionPredicates: List[T => Boolean] - def takeWhilePredicates: List[T => Boolean] - def dropWhilePredicates: List[T => Boolean] - def spanPredicates: List[T => Boolean] - def foldArguments: List[(T, (T, T) => T)] - def addAllTraversables: List[Traversable[T]] - def newArray(sz: Int): Array[T] - def groupByFunctions: List[T => T] -} - - - -trait SeqOperators[T] extends Operators[T] { - def segmentLengthPredicates: List[T => Boolean] - def indexWherePredicates: List[T => Boolean] - def lastIndexWherePredicates: List[T => Boolean] - def reverseMapFunctions: List[T => T] - def sameElementsSeqs: List[Seq[T]] - def startEndSeqs: List[Seq[T]] -} diff --git a/test/files/scalacheck/parallel-collections/PairOperators.scala b/test/files/scalacheck/parallel-collections/PairOperators.scala deleted file mode 100644 index fe851114be..0000000000 --- a/test/files/scalacheck/parallel-collections/PairOperators.scala +++ /dev/null @@ -1,101 +0,0 @@ -package scala.collection.parallel.ops - - -import scala.collection.parallel._ - - -trait PairOperators[K, V] extends Operators[(K, V)] { - def koperators: Operators[K] - def voperators: Operators[V] - - private def zipPredicates(kps: List[K => Boolean], vps: List[V => Boolean]): List[((K, V)) => Boolean] = for { - (kp, vp) <- koperators.countPredicates zip voperators.countPredicates - } yield new Function1[(K, V), Boolean] { - def apply(kv: (K, V)) = kp(kv._1) && vp(kv._2) - } - - /* operators */ - - def reduceOperators = for { - (kop, vop) <- koperators.reduceOperators zip voperators.reduceOperators - } yield new Function2[(K, V), (K, V), (K, V)] { - def apply(kv1: (K, V), kv2: (K, V)) = (kop(kv1._1, kv2._1), vop(kv1._2, kv2._2)) - } - - def countPredicates = zipPredicates(koperators.countPredicates, voperators.countPredicates) - - def forallPredicates = zipPredicates(koperators.forallPredicates, voperators.forallPredicates) - - def existsPredicates = zipPredicates(koperators.existsPredicates, voperators.existsPredicates) - - def findPredicates = zipPredicates(koperators.findPredicates, voperators.findPredicates) - - def mapFunctions = for { - (km, vm) <- koperators.mapFunctions zip voperators.mapFunctions - } yield new Function1[(K, V), (K, V)] { - def apply(kv: (K, V)) = (km(kv._1), vm(kv._2)) - } - - def partialMapFunctions = for { - (kpm, vpm) <- koperators.partialMapFunctions zip voperators.partialMapFunctions - } yield new PartialFunction[(K, V), (K, V)] { - def isDefinedAt(kv: (K, V)) = kpm.isDefinedAt(kv._1) && vpm.isDefinedAt(kv._2) - def apply(kv: (K, V)) = (kpm(kv._1), vpm(kv._2)) - } - - def flatMapFunctions = for { - (kfm, vfm) <- koperators.flatMapFunctions zip voperators.flatMapFunctions - } yield new Function1[(K, V), Traversable[(K, V)]] { - def apply(kv: (K, V)) = kfm(kv._1).toIterable zip vfm(kv._2).toIterable - } - - def filterPredicates = zipPredicates(koperators.filterPredicates, voperators.filterPredicates) - - def filterNotPredicates = filterPredicates - - def partitionPredicates = filterPredicates - - def takeWhilePredicates = zipPredicates(koperators.takeWhilePredicates, voperators.takeWhilePredicates) - - def dropWhilePredicates = takeWhilePredicates - - def spanPredicates = takeWhilePredicates - - def foldArguments = for { - ((kinit, kop), (vinit, vop)) <- koperators.foldArguments zip voperators.foldArguments - } yield ((kinit, vinit), new Function2[(K, V), (K, V), (K, V)] { - def apply(kv1: (K, V), kv2: (K, V)) = (kop(kv1._1, kv2._1), vop(kv1._2, kv2._2)) - }) - - def addAllTraversables = for { - (kt, vt) <- koperators.addAllTraversables zip voperators.addAllTraversables - } yield kt.toIterable zip vt.toIterable - - def newArray(sz: Int) = new Array[(K, V)](sz) - - def groupByFunctions = (koperators.groupByFunctions zip voperators.groupByFunctions) map { - opt => { (p: (K, V)) => (opt._1(p._1), opt._2(p._2)) } - } - -} - - - - - - - - - - - - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/PairValues.scala b/test/files/scalacheck/parallel-collections/PairValues.scala deleted file mode 100644 index 864dad2425..0000000000 --- a/test/files/scalacheck/parallel-collections/PairValues.scala +++ /dev/null @@ -1,28 +0,0 @@ -package scala.collection.parallel.ops - - - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties -import org.scalacheck.Arbitrary._ - - - - -trait PairValues[K, V] { - def kvalues: Seq[Gen[K]] - def vvalues: Seq[Gen[V]] - - def values = for { - kg <- kvalues - vg <- vvalues - } yield for { - k <- kg - v <- vg - } yield (k, v) -} diff --git a/test/files/scalacheck/parallel-collections/ParallelArrayCheck.scala b/test/files/scalacheck/parallel-collections/ParallelArrayCheck.scala deleted file mode 100644 index 605c16857a..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelArrayCheck.scala +++ /dev/null @@ -1,72 +0,0 @@ -package scala.collection.parallel -package mutable - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties -import org.scalacheck.Arbitrary._ - -import scala.collection._ -import scala.collection.parallel.ops._ - - -abstract class ParallelArrayCheck[T](tp: String) extends ParallelSeqCheck[T]("ParArray[" + tp + "]") { - // ForkJoinTasks.defaultForkJoinPool.setMaximumPoolSize(Runtime.getRuntime.availableProcessors * 2) - // ForkJoinTasks.defaultForkJoinPool.setParallelism(Runtime.getRuntime.availableProcessors * 2) - - type CollType = ParArray[T] - - def isCheckingViews = false - - def hasStrictOrder = true - - def tasksupport: TaskSupport - - def ofSize(vals: Seq[Gen[T]], sz: Int) = { - val a = new mutable.ArrayBuffer[T](sz) - val gen = vals(rnd.nextInt(vals.size)) - for (i <- 0 until sz) a += sample(gen) - a - } - - def fromSeq(a: Seq[T]) = { - val pa = new ParArray[T](a.size) - pa.tasksupport = tasksupport - var i = 0 - for (elem <- a.toList) { - pa(i) = elem - i += 1 - } - pa - } - - property("array mappings must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - val results = for ((f, ind) <- mapFunctions.zipWithIndex) - yield ("op index: " + ind) |: t.map(f) == coll.map(f) - results.reduceLeft(_ && _) - } - -} - - -class IntParallelArrayCheck(val tasksupport: TaskSupport) extends ParallelArrayCheck[Int]("Int") with IntSeqOperators with IntValues { - override def instances(vals: Seq[Gen[Int]]) = oneOf(super.instances(vals), sized { sz => - (0 until sz).toArray.toSeq - }, sized { sz => - (-sz until 0).toArray.toSeq - }) -} - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/ParallelArrayTest.scala b/test/files/scalacheck/parallel-collections/ParallelArrayTest.scala deleted file mode 100644 index db2b1ea01e..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelArrayTest.scala +++ /dev/null @@ -1,112 +0,0 @@ -// package test.scala.collection.parallel.mutable - -// import org.scalatest.FunSuite -// import collection.parallel.mutable.ParallelArray - -// /** -// * Notes: -// */ -// class ParallelArrayTest extends FunSuite { - -// test("create new parallel array with a bad initial capacity"){ -// intercept[IllegalArgumentException]{ -// new ParallelArray(-5) -// } - -// /** -// * this currently passes, but do we want it to? -// * does it have meaning to have an empty parallel array? -// */ -// new ParallelArray(0) -// () -// } - -// test("compare identical ParallelArrays"){ -// assert(new ParallelArray(5) === new ParallelArray(5)) -// assert(ParallelArray(1,2,3,4,5) === ParallelArray(1,2,3,4,5)) -// } - -// /** -// * this test needs attention. how is equality defined on ParallelArrays? -// * Well, the same way it is for normal collections, I guess. For normal arrays its reference equality. -// * I do not think it should be that way in the case of ParallelArray-s. I'll check this with Martin. -// */ -// test("compare non-identical ParallelArrays"){ -// assert(ParallelArray(1,2,3,4,5) != ParallelArray(1,2,3,4), -// "compared PA's that I expect to not be identical, but they were!") -// } - -// test("creation via PA object [String]"){ -// val paFromApply: ParallelArray[String] = ParallelArray("x", "1", "true", "etrijwejiorwer") -// val paFromHandoff: ParallelArray[String] = ParallelArray.handoff(Array("x", "1", "true", "etrijwejiorwer")) -// val paFromCopy: ParallelArray[String] = ParallelArray.createFromCopy(Array("x", "1", "true", "etrijwejiorwer")) -// assert( paFromApply === paFromCopy ) -// assert( paFromApply === paFromCopy ) -// } - -// // // handoffs dont work for primitive types... -// // test("creation via PA object [Boolean]"){ -// // val paFromApply: ParallelArray[Boolean] = ParallelArray(true, false, true, false) -// // val paFromCopy: ParallelArray[Boolean] = ParallelArray.createFromCopy(Array(true, false, true, false)) -// // assert( paFromApply === paFromCopy ) -// // } -// // -// // // handoffs dont work for primitive types... -// // test("creation via PA object [Int]"){ -// // val paFromApply: ParallelArray[Int] = ParallelArray(1, 2, 4, 3) -// // val paFromCopy: ParallelArray[Int] = ParallelArray.createFromCopy(Array(1, 2, 4, 3)) -// // assert( paFromApply === paFromCopy ) -// // } - -// /** -// * This fails because handoff is really doing a copy. -// * TODO: look at handoff -// */ -// test("Handoff Is Really A Handoff"){ -// val arrayToHandOff = Array("a", "x", "y", "z") -// val paFromHandoff: ParallelArray[String] = ParallelArray.handoff(arrayToHandOff) -// arrayToHandOff(0) = "w" -// assert(paFromHandoff(0) === "w") -// } - -// test("simple reduce"){ -// assert( ParallelArray(1,2,3,4,5).reduce(_+_) === 15 ) -// } - -// test("simple count"){ -// assert( ParallelArray[Int]().count(_ > 7) === 0 ) -// assert( ParallelArray(1,2,3).count(_ > 7) === 0 ) -// assert( ParallelArray(1,2,3).count(_ <= 3) === 3 ) -// assert( ParallelArray(1,2,3,4,5,6,7,8,9,10).count(_ > 7 ) === 3 ) -// } - -// test("simple forall"){ -// assert( ParallelArray[Int]().forall(_ > 7) === true ) -// assert( ParallelArray(1,2,3).forall(_ > 3) === false ) -// assert( ParallelArray(1,2,3).forall(_ <= 3) === true ) -// assert( ParallelArray(1,2,3,4,5,6,7,8,9,10).forall(_ > 0) === true ) -// assert( ParallelArray(1,2,3,4,5,6,7,8,9,10).forall(_ < 5) === false ) -// } - -// /** -// */ -// test("simple foreach"){ -// val buf = new java.util.concurrent.ArrayBlockingQueue[Int](10000) -// ParallelArray((1 to 10000):_*).foreach(buf add _) -// (1 to 10000).foreach(i => assert( buf contains i, "buf should have contained:" + i )) -// } - -// test("simple exists"){ -// assert( ParallelArray[Int]().exists(_ => true) === false ) -// assert( ParallelArray(1,2,3).forall(_ > 3) === false ) -// assert( ParallelArray(1,2,3,4,5,6,7,8,9,10).exists(_ > 7) === true ) -// } - -// test("simple filter"){ -// assert(ParallelArray(1,2,3,4,5).filter( _ < 4 ) === ParallelArray(1,2,3)) -// } - -// test("simple map test"){ -// assert(ParallelArray(1,2,3,4,5).map( (_:Int) * 10 ) === ParallelArray(10,20,30,40,50)) -// } -// } diff --git a/test/files/scalacheck/parallel-collections/ParallelArrayViewCheck.scala b/test/files/scalacheck/parallel-collections/ParallelArrayViewCheck.scala deleted file mode 100644 index fb09a5bbb7..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelArrayViewCheck.scala +++ /dev/null @@ -1,122 +0,0 @@ -// package scala.collection.parallel -// package mutable - - - - - - -// import org.scalacheck._ -// import org.scalacheck.Gen -// import org.scalacheck.Gen._ -// import org.scalacheck.Prop._ -// import org.scalacheck.Properties -// import org.scalacheck.Arbitrary._ - -// import scala.collection.TraversableView -// import scala.collection.mutable.ArrayBuffer -// import scala.collection.parallel.ops._ -// import scala.collection.mutable.ArraySeq - - - -// abstract class ParallelArrayViewCheck[T](tp: String) -// extends ParallelSeqCheck[T]("ParallelSeqView[" + tp + ", ParallelArray[" + tp + "]]") { -// // ForkJoinTasks.defaultForkJoinPool.setMaximumPoolSize(Runtime.getRuntime.availableProcessors * 2) -// // ForkJoinTasks.defaultForkJoinPool.setParallelism(Runtime.getRuntime.availableProcessors * 2) - -// type CollType = ParallelSeqView[T, ParallelArray[T], ArraySeq[T]] - -// def isCheckingViews = true - -// def instances(vals: Seq[Gen[T]]): Gen[Seq[T]] = sized { sz => -// val a = new ArrayBuffer[T](sz) -// val gen = vals(rnd.nextInt(vals.size)) -// for (i <- 0 until sz) a += sample(gen) -// a -// } - -// def fromSeq(a: Seq[T]) = { -// val pa = new ParallelArray[T](a.size) -// var i = 0 -// for (elem <- a) { -// pa(i) = elem -// i += 1 -// } -// pa.view -// } - -// property("forces must be equal") = forAllNoShrink(collectionPairs) { case (s, coll) => -// val smodif = (s ++ s).reverse.take(s.length).reverse.zip(s).drop(s.length / 2) -// val cmodif = (coll ++ s).reverse.take(s.length).reverse.zip(s).drop(s.length / 2).force -// smodif == cmodif -// } - -// } - - -// object IntParallelArrayViewCheck extends ParallelArrayViewCheck[Int]("Int") with IntSeqOperators with IntValues { -// override def instances(vals: Seq[Gen[Int]]) = oneOf(super.instances(vals), sized { sz => -// (0 until sz).toArray.toSeq -// }, sized { sz => -// (-sz until 0).toArray.toSeq -// }) -// } - - -// abstract class ParallelArrayViewComposedCheck[T](tp: String) -// extends ParallelSeqCheck[T]("ParallelSeqView[" + tp + "], ParallelArray[" + tp + "].++.patch.reverse.take.reverse") { -// ForkJoinTasks.defaultForkJoinPool.setMaximumPoolSize(Runtime.getRuntime.availableProcessors * 2) -// ForkJoinTasks.defaultForkJoinPool.setParallelism(Runtime.getRuntime.availableProcessors * 2) - -// type CollType = collection.parallel.ParallelSeq[T] - -// def isCheckingViews = true - -// def instances(vals: Seq[Gen[T]]): Gen[Seq[T]] = sized { sz => -// val a = new ArrayBuffer[T](sz) -// val gen = vals(rnd.nextInt(vals.size)) -// for (i <- 0 until sz) a += sample(gen) -// a -// } - -// def fromSeq(a: Seq[T]) = { -// val pa = new ParallelArray[T](a.size) -// var i = 0 -// for (elem <- a) { -// pa(i) = elem -// i += 1 -// } -// val modified = (pa.view ++ a).patch(0, a, a.length).reverse -// val original = modified.take(modified.length / 2).reverse -// original -// } - -// } - - -// object IntParallelArrayViewComposedCheck extends ParallelArrayViewComposedCheck[Int]("Int") with IntSeqOperators with IntValues { -// override def instances(vals: Seq[Gen[Int]]) = oneOf(super.instances(vals), sized { sz => -// (0 until sz).toArray.toSeq -// }, sized { sz => -// (-sz until 0).toArray.toSeq -// }) -// } - - - - - - - - - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/ParallelCtrieCheck.scala b/test/files/scalacheck/parallel-collections/ParallelCtrieCheck.scala deleted file mode 100644 index cf15afb3b9..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelCtrieCheck.scala +++ /dev/null @@ -1,101 +0,0 @@ -package scala.collection.parallel -package mutable - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties -import org.scalacheck.Arbitrary._ - -import scala.collection._ -import scala.collection.parallel.ops._ - - - -abstract class ParallelConcurrentTrieMapCheck[K, V](tp: String) extends ParallelMapCheck[K, V]("mutable.ParConcurrentTrieMap[" + tp + "]") { - // ForkJoinTasks.defaultForkJoinPool.setMaximumPoolSize(Runtime.getRuntime.availableProcessors * 2) - // ForkJoinTasks.defaultForkJoinPool.setParallelism(Runtime.getRuntime.availableProcessors * 2) - - type CollType = ParTrieMap[K, V] - - def isCheckingViews = false - - def hasStrictOrder = false - - def tasksupport: TaskSupport - - def ofSize(vals: Seq[Gen[(K, V)]], sz: Int) = { - val ct = new concurrent.TrieMap[K, V] - val gen = vals(rnd.nextInt(vals.size)) - for (i <- 0 until sz) ct += sample(gen) - ct - } - - def fromTraversable(t: Traversable[(K, V)]) = { - val pct = new ParTrieMap[K, V] - pct.tasksupport = tasksupport - var i = 0 - for (kv <- t.toList) { - pct += kv - i += 1 - } - pct - } - -} - - -class IntIntParallelConcurrentTrieMapCheck(val tasksupport: TaskSupport) extends ParallelConcurrentTrieMapCheck[Int, Int]("Int, Int") -with PairOperators[Int, Int] -with PairValues[Int, Int] -{ - def intvalues = new IntValues {} - def kvalues = intvalues.values - def vvalues = intvalues.values - - val intoperators = new IntOperators {} - def voperators = intoperators - def koperators = intoperators - - override def printDataStructureDebugInfo(ds: AnyRef) = ds match { - case pm: ParTrieMap[k, v] => - println("Mutable parallel ctrie") - case _ => - println("could not match data structure type: " + ds.getClass) - } - - override def checkDataStructureInvariants(orig: Traversable[(Int, Int)], ds: AnyRef) = ds match { - // case pm: ParHashMap[k, v] if 1 == 0 => // disabled this to make tests faster - // val invs = pm.brokenInvariants - - // val containsall = (for ((k, v) <- orig) yield { - // if (pm.asInstanceOf[ParHashMap[Int, Int]].get(k) == Some(v)) true - // else { - // println("Does not contain original element: " + (k, v)) - // false - // } - // }).foldLeft(true)(_ && _) - - - // if (invs.isEmpty) containsall - // else { - // println("Invariants broken:\n" + invs.mkString("\n")) - // false - // } - case _ => true - } - -} - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/ParallelHashMapCheck.scala b/test/files/scalacheck/parallel-collections/ParallelHashMapCheck.scala deleted file mode 100644 index 34b3f33de2..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelHashMapCheck.scala +++ /dev/null @@ -1,100 +0,0 @@ -package scala.collection.parallel -package mutable - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties -import org.scalacheck.Arbitrary._ - -import scala.collection._ -import scala.collection.parallel.ops._ - - -abstract class ParallelHashMapCheck[K, V](tp: String) extends ParallelMapCheck[K, V]("mutable.ParHashMap[" + tp + "]") { - // ForkJoinTasks.defaultForkJoinPool.setMaximumPoolSize(Runtime.getRuntime.availableProcessors * 2) - // ForkJoinTasks.defaultForkJoinPool.setParallelism(Runtime.getRuntime.availableProcessors * 2) - - type CollType = ParHashMap[K, V] - - def isCheckingViews = false - - def hasStrictOrder = false - - def tasksupport: TaskSupport - - def ofSize(vals: Seq[Gen[(K, V)]], sz: Int) = { - val hm = new mutable.HashMap[K, V] - val gen = vals(rnd.nextInt(vals.size)) - for (i <- 0 until sz) hm += sample(gen) - hm - } - - def fromTraversable(t: Traversable[(K, V)]) = { - val phm = new ParHashMap[K, V] - phm.tasksupport = tasksupport - var i = 0 - for (kv <- t.toList) { - phm += kv - i += 1 - } - phm - } - -} - - -class IntIntParallelHashMapCheck(val tasksupport: TaskSupport) extends ParallelHashMapCheck[Int, Int]("Int, Int") -with PairOperators[Int, Int] -with PairValues[Int, Int] -{ - def intvalues = new IntValues {} - def kvalues = intvalues.values - def vvalues = intvalues.values - - val intoperators = new IntOperators {} - def voperators = intoperators - def koperators = intoperators - - override def printDataStructureDebugInfo(ds: AnyRef) = ds match { - case pm: ParHashMap[k, v] => - println("Mutable parallel hash map\n" + pm.hashTableContents.debugInformation) - case _ => - println("could not match data structure type: " + ds.getClass) - } - - override def checkDataStructureInvariants(orig: Traversable[(Int, Int)], ds: AnyRef) = ds match { - // case pm: ParHashMap[k, v] if 1 == 0 => // disabled this to make tests faster - // val invs = pm.brokenInvariants - - // val containsall = (for ((k, v) <- orig) yield { - // if (pm.asInstanceOf[ParHashMap[Int, Int]].get(k) == Some(v)) true - // else { - // println("Does not contain original element: " + (k, v)) - // false - // } - // }).foldLeft(true)(_ && _) - - - // if (invs.isEmpty) containsall - // else { - // println("Invariants broken:\n" + invs.mkString("\n")) - // false - // } - case _ => true - } - -} - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/ParallelHashSetCheck.scala b/test/files/scalacheck/parallel-collections/ParallelHashSetCheck.scala deleted file mode 100644 index 91de2472a7..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelHashSetCheck.scala +++ /dev/null @@ -1,97 +0,0 @@ -package scala.collection.parallel -package mutable - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties -import org.scalacheck.Arbitrary._ - -import scala.collection._ -import scala.collection.parallel.ops._ - - -abstract class ParallelHashSetCheck[T](tp: String) extends ParallelSetCheck[T]("mutable.ParHashSet[" + tp + "]") { - // ForkJoinTasks.defaultForkJoinPool.setMaximumPoolSize(Runtime.getRuntime.availableProcessors * 2) - // ForkJoinTasks.defaultForkJoinPool.setParallelism(Runtime.getRuntime.availableProcessors * 2) - - type CollType = ParHashSet[T] - - def isCheckingViews = false - - def hasStrictOrder = false - - def tasksupport: TaskSupport - - def ofSize(vals: Seq[Gen[T]], sz: Int) = { - val hm = new mutable.HashSet[T] - val gen = vals(rnd.nextInt(vals.size)) - for (i <- 0 until sz) hm += sample(gen) - hm - } - - def fromTraversable(t: Traversable[T]) = { - val phs = new ParHashSet[T] - phs.tasksupport = tasksupport - var i = 0 - for (kv <- t.toList) { - phs += kv - i += 1 - } - phs - } - -} - - -class IntParallelHashSetCheck(val tasksupport: TaskSupport) extends ParallelHashSetCheck[Int]("Int") -with IntOperators -with IntValues -{ - override def printDataStructureDebugInfo(ds: AnyRef) = ds match { - case pm: ParHashSet[t] => - println("Mutable parallel hash set") - case _ => - println("could not match data structure type: " + ds.getClass) - } - - override def checkDataStructureInvariants(orig: Traversable[Int], ds: AnyRef) = ds match { - // case pm: ParHashSet[t] if 1 == 0 => - // // for an example of how not to write code proceed below - // val invs = pm.brokenInvariants - - // val containsall = (for (elem <- orig) yield { - // if (pm.asInstanceOf[ParHashSet[Int]](elem) == true) true - // else { - // println("Does not contain original element: " + elem) - // println(pm.hashTableContents.table.find(_ == elem)) - // println(pm.hashTableContents.table.indexOf(elem)) - // false - // } - // }).foldLeft(true)(_ && _) - - - // if (invs.isEmpty) { - // if (!containsall) println(pm.debugInformation) - // containsall - // } else { - // println("Invariants broken:\n" + invs.mkString("\n")) - // false - // } - case _ => true - } - -} - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/ParallelHashTrieCheck.scala b/test/files/scalacheck/parallel-collections/ParallelHashTrieCheck.scala deleted file mode 100644 index 9e29be5429..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelHashTrieCheck.scala +++ /dev/null @@ -1,144 +0,0 @@ -package scala.collection.parallel -package immutable - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties -import org.scalacheck.Arbitrary._ - -import scala.collection._ -import scala.collection.parallel.ops._ - - -abstract class ParallelHashMapCheck[K, V](tp: String) extends ParallelMapCheck[K, V]("immutable.ParHashMap[" + tp + "]") { - // ForkJoinTasks.defaultForkJoinPool.setMaximumPoolSize(Runtime.getRuntime.availableProcessors * 2) - // ForkJoinTasks.defaultForkJoinPool.setParallelism(Runtime.getRuntime.availableProcessors * 2) - - type CollType = ParHashMap[K, V] - - def isCheckingViews = false - - def hasStrictOrder = false - - def tasksupport: TaskSupport - - def ofSize(vals: Seq[Gen[(K, V)]], sz: Int) = { - var hm = new immutable.HashMap[K, V] - val gen = vals(rnd.nextInt(vals.size)) - for (i <- 0 until sz) hm += sample(gen) - hm - } - - def fromTraversable(t: Traversable[(K, V)]) = { - var phm = new ParHashMap[K, V] - phm.tasksupport = tasksupport - var i = 0 - for (kv <- t.toList) { - phm += kv - i += 1 - } - phm - } - -} - - -class IntIntParallelHashMapCheck(val tasksupport: TaskSupport) extends ParallelHashMapCheck[Int, Int]("Int, Int") -with PairOperators[Int, Int] -with PairValues[Int, Int] -{ - def intvalues = new IntValues {} - def kvalues = intvalues.values - def vvalues = intvalues.values - - val intoperators = new IntOperators {} - def voperators = intoperators - def koperators = intoperators - - override def printDataStructureDebugInfo(ds: AnyRef) = ds match { - case pm: ParHashMap[k, v] => - pm.printDebugInfo - case _ => - println("could not match data structure type: " + ds.getClass) - } -} - - - -abstract class ParallelHashSetCheck[T](tp: String) extends ParallelSetCheck[T]("immutable.ParHashSet[" + tp + "]") { - // ForkJoinTasks.defaultForkJoinPool.setMaximumPoolSize(Runtime.getRuntime.availableProcessors * 2) - // ForkJoinTasks.defaultForkJoinPool.setParallelism(Runtime.getRuntime.availableProcessors * 2) - - type CollType = ParHashSet[T] - - def isCheckingViews = false - - def hasStrictOrder = false - - def tasksupport: TaskSupport - - def ofSize(vals: Seq[Gen[T]], sz: Int) = { - var hm = new immutable.HashSet[T] - val gen = vals(rnd.nextInt(vals.size)) - for (i <- 0 until sz) hm += sample(gen) - hm - } - - def fromTraversable(t: Traversable[T]) = { - var phs = new ParHashSet[T] - phs.tasksupport = tasksupport - var i = 0 - for (kv <- t.toList) { - phs += kv - i += 1 - } - phs - } - - override def printDataStructureDebugInfo(ds: AnyRef) = ds match { - case pm: ParHashSet[t] => - println("Parallel hash set") - case _ => - println("could not match data structure type: " + ds.getClass) - } - -} - - -class IntParallelHashSetCheck(val tasksupport: TaskSupport) extends ParallelHashSetCheck[Int]("Int") -with IntOperators -with IntValues -{ - def intvalues = new IntValues {} - def kvalues = intvalues.values - def vvalues = intvalues.values - - override def printDataStructureDebugInfo(ds: AnyRef) = ds match { - case pm: ParHashMap[k, v] => - pm.printDebugInfo - case _ => - println("could not match data structure type: " + ds.getClass) - } -} - - - - - - - - - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/ParallelIterableCheck.scala b/test/files/scalacheck/parallel-collections/ParallelIterableCheck.scala deleted file mode 100644 index 7e7ef2ce1b..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelIterableCheck.scala +++ /dev/null @@ -1,477 +0,0 @@ -package scala.collection.parallel - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties - -import scala.collection._ -import scala.collection.parallel._ - - - - -abstract class ParallelIterableCheck[T](collName: String) extends Properties(collName) with Operators[T] { - type CollType <: ParIterable[T] - - def values: Seq[Gen[T]] - def ofSize(vals: Seq[Gen[T]], sz: Int): Iterable[T] - def fromTraversable(t: Traversable[T]): CollType - def isCheckingViews: Boolean - def hasStrictOrder: Boolean - - - def instances(vals: Seq[Gen[T]]): Gen[Iterable[T]] = oneOf( - sized( - sz => - ofSize(vals, sz) - ), - for (sz <- choose(1000, 2000)) yield ofSize(vals, sz), - for (sz <- choose(4000, 4001)) yield ofSize(vals, sz), - for (sz <- choose(10000, 10001)) yield ofSize(vals, sz) - ) - - // used to check if constructed collection is valid - def checkDataStructureInvariants(orig: Traversable[T], cf: AnyRef) = { - // can be overridden in subclasses - true - } - - def printDataStructureDebugInfo(cf: AnyRef) { - // can be overridden in subclasses - } - - val rnd = new scala.util.Random - - def sample(gen: Gen[T]): T = { - var s = gen.sample - while (s == None) s = gen.sample - s.get - } - - def sampleValue: T = sample(values(rnd.nextInt(values.length))) - - def collectionPairs = for (inst <- instances(values)) yield (inst, fromTraversable(inst)) - - def collectionPairsWithLengths = for (inst <- instances(values); s <- choose(0, inst.size)) - yield (inst, fromTraversable(inst), s) - - def collectionPairsWith2Indices = for ( - inst <- instances(values); - f <- choose(0, inst.size); - s <- choose(0, inst.size)) - yield (inst, fromTraversable(inst), f, s) - - def collectionTriplets = for (inst <- instances(values); - updStart <- choose(0, inst.size); howMany <- choose(0, inst.size)) yield { - val modif = inst.toSeq.patch(updStart, inst.toSeq, howMany) - (inst, fromTraversable(inst), modif) - } - - def areEqual(t1: GenTraversable[T], t2: GenTraversable[T]) = if (hasStrictOrder) { - t1 == t2 && t2 == t1 - } else (t1, t2) match { // it is slightly delicate what `equal` means if the order is not strict - case (m1: GenMap[_, _], m2: GenMap[_, _]) => m1 == m2 && m2 == m1 - case (i1: GenIterable[_], i2: GenIterable[_]) => - val i1s = i1.toSet - val i2s = i2.toSet - i1s == i2s && i2s == i1s - case _ => t1 == t2 && t2 == t1 - } - - def printDebugInfo(coll: ParIterableLike[_, _, _]) { - println("Collection debug info: ") - coll.printDebugBuffer - println("Task debug info: ") - println(coll.tasksupport.debugMessages.mkString("\n")) - } - - def printComparison(t: Traversable[_], coll: ParIterable[_], tf: Traversable[_], cf: ParIterable[_], ind: Int) { - printDebugInfo(coll) - println("Operator: " + ind) - println("sz: " + t.size) - println(t) - println - println("sz: " + coll.size) - println(coll) - println("transformed to:") - println - println("size: " + tf.size) - println(tf) - println - println("size: " + cf.size) - println(cf) - println - println("tf == cf - " + (tf == cf)) - println("cf == tf - " + (cf == tf)) - } - - property("reductions must be equal for assoc. operators") = forAllNoShrink(collectionPairs) { case (t, coll) => - if (t.size != 0) { - val results = for ((op, ind) <- reduceOperators.zipWithIndex) yield { - val tr = t.reduceLeft(op) - val cr = coll.reduce(op) - if (tr != cr) { - println("from: " + t) - println("and: " + coll) - println("reducing with " + ind) - println(tr) - println(cr) - } - ("op index: " + ind) |: tr == cr - } - results.reduceLeft(_ && _) - } else "has size 0" |: true - } - - property("counts must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - val results = for ((pred, ind) <- countPredicates.zipWithIndex) yield { - val tc = t.count(pred) - val cc = coll.count(pred) - if (tc != cc) { - println("from: " + t + " - size: " + t.size) - println("and: " + coll + " - size: " + coll.toList.size) - println(tc) - println(cc) - printDebugInfo(coll) - } - ("op index: " + ind) |: tc == cc - } - results.reduceLeft(_ && _) - } - - property("forall must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - val results = for ((pred, ind) <- forallPredicates.zipWithIndex) - yield ("op index: " + ind) |: t.forall(pred) == coll.forall(pred) - results.reduceLeft(_ && _) - } - - property("exists must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - val results = for ((pred, ind) <- existsPredicates.zipWithIndex) - yield ("op index: " + ind) |: t.exists(pred) == coll.exists(pred) - results.reduceLeft(_ && _) - } - - property("both must find or not find an element") = forAllNoShrink(collectionPairs) { case (t, coll) => - val results = for ((pred, ind) <- findPredicates.zipWithIndex) yield { - val ft = t.find(pred) - val fcoll = coll.find(pred) - ("op index: " + ind) |: ((ft == None && fcoll == None) || (ft != None && fcoll != None)) - } - results.reduceLeft(_ && _) - } - - property("mappings must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - val results = for ((f, ind) <- mapFunctions.zipWithIndex) yield { - val ms = t.map(f) - val mp = coll.map(f) - val invs = checkDataStructureInvariants(ms, mp) - if (!areEqual(ms, mp) || !invs) { - println(t) - println(coll) - println("mapped to: ") - println(ms) - println(mp) - println("sizes: ") - println(ms.size) - println(mp.size) - println("valid: " + invs) - } - ("op index: " + ind) |: (areEqual(ms, mp) && invs) - } - results.reduceLeft(_ && _) - } - - property("collects must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - val results = for ((f, ind) <- partialMapFunctions.zipWithIndex) yield { - val ps = t.collect(f) - val pp = coll.collect(f) - if (!areEqual(ps, pp)) { - println(t) - println(coll) - println("collected to: ") - println(ps) - println(pp) - } - ("op index: " + ind) |: areEqual(ps, pp) - } - results.reduceLeft(_ && _) - } - - property("flatMaps must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - (for ((f, ind) <- flatMapFunctions.zipWithIndex) - yield ("op index: " + ind) |: areEqual(t.flatMap(f), coll.flatMap(f))).reduceLeft(_ && _) - } - - property("filters must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - (for ((p, ind) <- filterPredicates.zipWithIndex) yield { - val tf = t.filter(p) - val cf = coll.filter(p) - val invs = checkDataStructureInvariants(tf, cf) - if (tf != cf || cf != tf || !invs) { - printDebugInfo(coll) - println("Operator: " + ind) - println("sz: " + t.size) - println(t) - println - println("sz: " + coll.size) - println(coll) - println - println("filtered to:") - println - println(cf) - println - println(tf) - println - println("tf == cf - " + (tf == cf)) - println("cf == tf - " + (cf == tf)) - printDataStructureDebugInfo(cf) - println("valid: " + invs) - } - ("op index: " + ind) |: tf == cf && cf == tf && invs - }).reduceLeft(_ && _) - } - - property("filterNots must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - (for ((p, ind) <- filterNotPredicates.zipWithIndex) yield { - val tf = t.filterNot(p) - val cf = coll.filterNot(p) - if (tf != cf || cf != tf) printComparison(t, coll, tf, cf, ind) - ("op index: " + ind) |: tf == cf && cf == tf - }).reduceLeft(_ && _) - } - - if (!isCheckingViews) property("partitions must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - (for ((p, ind) <- partitionPredicates.zipWithIndex) yield { - val tpart = t.partition(p) - val cpart = coll.partition(p) - if (tpart != cpart) { - println("from: " + t) - println("and: " + coll) - println(cpart) - println(tpart) - } - ("op index: " + ind) |: tpart == cpart - }).reduceLeft(_ && _) - } - - if (hasStrictOrder) property("takes must be equal") = forAllNoShrink(collectionPairsWithLengths) { case (t, coll, n) => - ("take " + n + " elements") |: t.take(n) == coll.take(n) - } - - if (hasStrictOrder) property("drops must be equal") = forAllNoShrink(collectionPairsWithLengths) { case (t, coll, n) => - ("drop " + n + " elements") |: t.drop(n) == coll.drop(n) - } - - if (hasStrictOrder) property("slices must be equal") = forAllNoShrink(collectionPairsWith2Indices) - { case (t, coll, fr, slicelength) => - val from = if (fr < 0) 0 else fr - val until = if (from + slicelength > t.size) t.size else from + slicelength - val tsl = t.slice(from, until) - val collsl = coll.slice(from, until) - if (tsl != collsl) { - println("---------------------- " + from + ", " + until) - println("from: " + t) - println("and: " + coll) - println(tsl) - println(collsl) - println("as list: " + collsl.toList) - println(collsl.iterator.hasNext) - println(collsl.iterator.next) - println(collsl.iterator.hasNext) - println(collsl.iterator.next) - println(collsl.iterator.hasNext) - println(collsl.iterator.next) - println(collsl.iterator.hasNext) - } - ("slice from " + from + " until " + until) |: tsl == collsl - } - - if (hasStrictOrder) property("splits must be equal") = forAllNoShrink(collectionPairsWithLengths) { case (t, coll, n) => - val tspl = t.splitAt(n) - val cspl = coll.splitAt(n) - if (tspl != cspl) { - println("at: " + n) - println("from: " + t) - println("and: " + coll) - println(tspl) - println(cspl) - } - ("splitAt " + n) |: tspl == cspl - } - - if (hasStrictOrder) property("takeWhiles must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - (for ((pred, ind) <- takeWhilePredicates.zipWithIndex) yield { - val tt = t.takeWhile(pred) - val ct = coll.takeWhile(pred) - if (tt != ct) { - println("from: " + t) - println("and: " + coll) - println("taking while...") - println(tt) - println(ct) - } - ("operator " + ind) |: tt == ct - }).reduceLeft(_ && _) - } - - if (hasStrictOrder) property("spans must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - (for ((pred, ind) <- spanPredicates.zipWithIndex) yield { - val tsp = t.span(pred) - val csp = coll.span(pred) - if (tsp != csp) { - println("from: " + t) - println("and: " + coll) - println("span with predicate " + ind) - println(tsp) - println(csp) - println("---------------------------------") - println(coll.span(pred)) - println("---------------------------------") - } - ("operator " + ind) |: tsp == csp - }).reduceLeft(_ && _) - } - - if (hasStrictOrder) property("dropWhiles must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - (for ((pred, ind) <- dropWhilePredicates.zipWithIndex) yield { - ("operator " + ind) |: t.dropWhile(pred) == coll.dropWhile(pred) - }).reduceLeft(_ && _) - } - - property("folds must be equal for assoc. operators") = forAllNoShrink(collectionPairs) { case (t, coll) => - (for (((first, op), ind) <- foldArguments.zipWithIndex) yield { - val tres = t.foldLeft(first)(op) - val cres = coll.fold(first)(op) - if (cres != tres) { - println("from: " + t) - println("and: " + coll) - println("folds are: ") - println(tres) - println(cres) - } - ("operator " + ind) |: tres == cres - }).reduceLeft(_ && _) - } - - property("++s must be equal") = forAll(collectionTriplets) { case (t, coll, colltoadd) => - try { - val toadd = colltoadd - val tr = t ++ toadd.iterator - val cr = coll ++ toadd.iterator - if (!areEqual(tr, cr)) { - println("from: " + t) - println("and: " + coll.iterator.toList) - println("adding: " + toadd) - println(tr.toList) - println(cr.iterator.toList) - } - ("adding " |: areEqual(tr, cr)) && - (for ((trav, ind) <- (addAllTraversables).zipWithIndex) yield { - val tadded = t ++ trav - val cadded = coll ++ collection.parallel.mutable.ParArray(trav.toSeq: _*) - if (!areEqual(tadded, cadded)) { - println("----------------------") - println("from: " + t) - println("and: " + coll) - println("adding: " + trav) - println(tadded) - println(cadded) - } - ("traversable " + ind) |: areEqual(tadded, cadded) - }).reduceLeft(_ && _) - } catch { - case e: java.lang.Exception => - throw e - } - } - - if (hasStrictOrder) property("copies to array must be equal") = forAllNoShrink(collectionPairs) { case (t, coll) => - val tarr = newArray(t.size) - val collarr = newArray(coll.size) - t.copyToArray(tarr, 0, t.size) - coll.copyToArray(collarr, 0, coll.size) - if (tarr.toSeq != collarr.toSeq) { - println("from: " + t) - println("and: " + coll) - println(tarr.toSeq) - println(collarr.toSeq) - } - tarr.toSeq == collarr.toSeq - } - - if (hasStrictOrder) property("scans must be equal") = forAllNoShrink(collectionPairs) { - case (t, coll) => - (for (((first, op), ind) <- foldArguments.zipWithIndex) yield { - val tscan = t.scanLeft(first)(op) - val cscan = coll.scan(first)(op) - if (tscan != cscan || cscan != tscan) { - println("from: " + t) - println("and: " + coll) - println("scans are: ") - println(tscan) - println(cscan) - } - ("operator " + ind) |: tscan == cscan && cscan == tscan - }).reduceLeft(_ && _) - } - - property("groupBy must be equal") = forAllNoShrink(collectionPairs) { - case (t, coll) => - (for ((f, ind) <- groupByFunctions.zipWithIndex) yield { - val tgroup = t.groupBy(f) - val cgroup = coll.groupBy(f) - if (tgroup != cgroup || cgroup != tgroup) { - println("from: " + t) - println("and: " + coll) - println("groups are: ") - println(tgroup) - println(cgroup) - } - ("operator " + ind) |: tgroup == cgroup && cgroup == tgroup - }).reduceLeft(_ && _) - } - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/ParallelMapCheck1.scala b/test/files/scalacheck/parallel-collections/ParallelMapCheck1.scala deleted file mode 100644 index 50aa4ad0c7..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelMapCheck1.scala +++ /dev/null @@ -1,67 +0,0 @@ -package scala.collection.parallel - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties - -import scala.collection._ -import scala.collection.parallel._ - - - - -abstract class ParallelMapCheck[K, V](collname: String) extends ParallelIterableCheck[(K, V)](collname) { - type CollType <: ParMap[K, V] - - property("gets iterated keys") = forAllNoShrink(collectionPairs) { - case (t, coll) => - val containsT = for ((k, v) <- t) yield (coll.get(k) == Some(v)) - val containsSelf = coll.map { case (k, v) => coll.get(k) == Some(v) } - ("Par contains elements of seq map" |: containsT.forall(_ == true)) && - ("Par contains elements of itself" |: containsSelf.forall(_ == true)) - } - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/ParallelRangeCheck.scala b/test/files/scalacheck/parallel-collections/ParallelRangeCheck.scala deleted file mode 100644 index a80d1a27a1..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelRangeCheck.scala +++ /dev/null @@ -1,75 +0,0 @@ -package scala.collection.parallel -package immutable - - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties -import org.scalacheck.Arbitrary._ - -import scala.collection._ -import scala.collection.parallel.ops._ - - - - -class ParallelRangeCheck(val tasksupport: TaskSupport) extends ParallelSeqCheck[Int]("ParallelRange[Int]") with ops.IntSeqOperators { - // ForkJoinTasks.defaultForkJoinPool.setMaximumPoolSize(Runtime.getRuntime.availableProcessors * 2) - // ForkJoinTasks.defaultForkJoinPool.setParallelism(Runtime.getRuntime.availableProcessors * 2) - - type CollType = collection.parallel.ParSeq[Int] - - def hasStrictOrder = true - - def isCheckingViews = false - - def ofSize(vals: Seq[Gen[Int]], sz: Int) = throw new UnsupportedOperationException - - override def instances(vals: Seq[Gen[Int]]): Gen[Seq[Int]] = sized { start => - sized { end => - sized { step => - new Range(start, end, if (step != 0) step else 1) - } - } - } - - def fromSeq(a: Seq[Int]) = a match { - case r: Range => - val pr = ParRange(r.start, r.end, r.step, false) - pr.tasksupport = tasksupport - pr - case _ => - val pa = new parallel.mutable.ParArray[Int](a.length) - pa.tasksupport = tasksupport - for (i <- 0 until a.length) pa(i) = a(i) - pa - } - - override def traversable2Seq(t: Traversable[Int]): Seq[Int] = t match { - case r: Range => r - case _ => t.toSeq - } - - def values = Seq(choose(-100, 100)) - -} - - - - - - - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/ParallelSeqCheck.scala b/test/files/scalacheck/parallel-collections/ParallelSeqCheck.scala deleted file mode 100644 index 48c3d3f745..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelSeqCheck.scala +++ /dev/null @@ -1,300 +0,0 @@ -package scala.collection.parallel - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties - -import scala.collection._ -import scala.collection.parallel._ - - - - - -abstract class ParallelSeqCheck[T](collName: String) extends ParallelIterableCheck[T](collName) with SeqOperators[T] { - - type CollType <: collection.parallel.ParSeq[T] - - - def ofSize(vals: Seq[Gen[T]], sz: Int): Seq[T] - def fromSeq(s: Seq[T]): CollType - - override def instances(vals: Seq[Gen[T]]): Gen[Seq[T]] = oneOf( - Gen.const(ofSize(vals, 1)), - sized( - sz => - ofSize(vals, sz) - ), - for (sz <- choose(1000, 2000)) yield ofSize(vals, sz) - ) - - - def fromTraversable(t: Traversable[T]) = fromSeq(traversable2Seq(t)) - def traversable2Seq(t: Traversable[T]): Seq[T] = { - if (t.isInstanceOf[Iterable[_]]) t.asInstanceOf[Iterable[T]].iterator.toList else t.toList - } - - override def collectionPairs: Gen[(Seq[T], CollType)] = for (inst <- instances(values)) yield (inst, fromSeq(inst)) - - override def collectionPairsWithLengths: Gen[(Seq[T], CollType, Int)] = - for (inst <- instances(values); s <- choose(0, inst.size)) yield (inst, fromSeq(inst), s); - - def collectionPairsWithModifiedWithLengths: Gen[(Seq[T], CollType, ParSeq[T], Int)] = - for (inst <- instances(values); s <- choose(0, inst.size); - updateStart <- choose(0, inst.size); howMany <- choose(0, inst.size)) yield { - val parcoll = fromSeq(inst) - val parcollmodif = fromSeq(modifySlightly(inst, updateStart, howMany)) - (inst, parcoll, parcollmodif, s) - } - - def collectionPairsWithModified: Gen[(Seq[T], CollType, ParSeq[T])] = - for (inst <- instances(values); updateStart <- choose(0, inst.size); howMany <- choose(0, inst.size)) yield { - val parcoll = fromSeq(inst) - val parcollmodif = fromSeq(modifySlightly(inst, updateStart, howMany)) - (inst, parcoll, parcollmodif) - } - - def collectionPairsWithSliced: Gen[(Seq[T], CollType, ParSeq[T])] = - for (inst <- instances(values); sliceStart <- choose(0, inst.size); howMany <- choose(0, inst.size)) yield { - val parcoll = fromSeq(inst) - val parcollsliced = fromSeq(inst.slice(sliceStart, sliceStart + howMany)) - (inst, parcoll, parcollsliced) - } - - def collectionTripletsWith2Indices: Gen[(Seq[T], CollType, Seq[T], Int, Int)] = - for (inst <- instances(values); f <- choose(0, inst.size); s <- choose(0, inst.size - f); - third <- instances(values); sliceStart <- choose(0, inst.size); howMany <- choose(0, inst.size)) yield { - (inst, fromSeq(inst), inst.slice(sliceStart, sliceStart + howMany), f, s) - } - - private def modifySlightly(coll: Seq[T], updateStart: Int, howMany: Int) = { - coll.patch(updateStart, coll, howMany) - } - - property("segmentLengths must be equal") = forAllNoShrink(collectionPairsWithLengths) { case (s, coll, len) => - (for ((pred, ind) <- segmentLengthPredicates.zipWithIndex) yield { - val slen = s.segmentLength(pred, if (len < 0) 0 else len) - val clen = coll.segmentLength(pred, len) - if (slen != clen) { - println("from: " + s) - println("and: " + coll) - println(slen) - println(clen) - } - ("operator " + ind) |: slen == clen - }).reduceLeft(_ && _) - } - - property("prefixLengths must be equal") = forAllNoShrink(collectionPairs) { case (s, coll) => - (for ((pred, ind) <- segmentLengthPredicates.zipWithIndex) yield { - ("operator " + ind) |: s.prefixLength(pred) == coll.prefixLength(pred) - }).reduceLeft(_ && _) - } - - property("indexWheres must be equal") = forAllNoShrink(collectionPairsWithLengths) { case (s, coll, len) => - (for ((pred, ind) <- indexWherePredicates.zipWithIndex) yield { - val sind = s.indexWhere(pred, len) - val cind = coll.indexWhere(pred, len) - if (sind != cind) { - println("from: " + s) - println("and: " + coll) - println("at: " + len) - println(sind) - println(cind) - } - ("operator " + ind) |: sind == cind - }).reduceLeft(_ && _) - } - - property("lastIndexWheres must be equal") = forAllNoShrink(collectionPairsWithLengths) { case (s, coll, len) => - (for ((pred, ind) <- lastIndexWherePredicates.zipWithIndex) yield { - val end = if (len >= s.size) s.size - 1 else len - val sind = s.lastIndexWhere(pred, end) - val cind = coll.lastIndexWhere(pred, end) - ("operator " + ind) |: sind == cind - }).reduceLeft(_ && _) - } - - property("reverses must be equal") = forAllNoShrink(collectionPairs) { case (s, coll) => - (s.length == 0 && s.getClass == classOf[collection.immutable.Range]) || - { - val sr = s.reverse - val cr = coll.reverse - if (sr != cr) { - println("from: " + s) - println("and: " + coll) - println(sr) - println(cr) - } - sr == cr - } - } - - property("reverseMaps must be equal") = forAllNoShrink(collectionPairs) { case (s, coll) => - (for ((f, ind) <- reverseMapFunctions.zipWithIndex) yield { - ("operator " + ind) |: s.reverseMap(f) == coll.reverseMap(f) - }).reduceLeft(_ && _) - } - - property("sameElements must be equal") = forAllNoShrink(collectionPairsWithModifiedWithLengths) { - case (s, coll, collmodif, len) => - val pos = if (len < 0) 0 else len - val scm = s.sameElements(collmodif) - val ccm = coll.sameElements(collmodif) - if (scm != ccm) { - println("Comparing: " + s) - println("and: " + coll) - println("with: " + collmodif) - println(scm) - println(ccm) - } - ("Nil" |: s.sameElements(Nil) == coll.sameElements(Nil)) && - ("toList" |: s.sameElements(s.toList) == coll.sameElements(coll.toList)) && - ("identity" |: s.sameElements(s.map(e => e)) == coll.sameElements(coll.map(e => e))) && - ("vice-versa" |: s.sameElements(coll) == coll.sameElements(s)) && - ("equal" |: s.sameElements(coll)) && - ("modified" |: scm == ccm) && - (for ((it, ind) <- sameElementsSeqs.zipWithIndex) yield { - val sres = s.sameElements(it) - val pres = coll.sameElements(it) - if (sres != pres) { - println("Comparing: " + s) - println("and: " + coll) - println("with: " + it) - println(sres) - println(pres) - } - ("collection " + ind) |: sres == pres - }).reduceLeft(_ && _) - } - - property("startsWiths must be equal") = forAllNoShrink(collectionPairsWithModifiedWithLengths) { - case (s, coll, collmodif, len) => - val pos = if (len < 0) 0 else len - ("start with self" |: s.startsWith(s) == coll.startsWith(coll)) && - ("tails correspond" |: (s.length == 0 || s.startsWith(s.tail, 1) == coll.startsWith(coll.tail, 1))) && - ("with each other" |: coll.startsWith(s)) && - ("modified" |: s.startsWith(collmodif) == coll.startsWith(collmodif)) && - ("modified2" |: s.startsWith(collmodif, pos) == coll.startsWith(collmodif, pos)) && - (for (sq <- startEndSeqs) yield { - val ss = s.startsWith(sq, pos) - val cs = coll.startsWith(fromSeq(sq), pos) - if (ss != cs) { - println("from: " + s) - println("and: " + coll) - println("test seq: " + sq) - println("from pos: " + pos) - println(ss) - println(cs) - println(coll.iterator.psplit(pos, coll.length - pos)(1).toList) - } - ("seq " + sq) |: ss == cs - }).reduceLeft(_ && _) - } - - property("endsWiths must be equal") = forAllNoShrink(collectionPairsWithModified) { - case (s, coll, collmodif) => - ("ends with self" |: s.endsWith(s) == coll.endsWith(s)) && - ("ends with tail" |: (s.length == 0 || s.endsWith(s.tail) == coll.endsWith(coll.tail))) && - ("with each other" |: coll.endsWith(s)) && - ("modified" |: s.startsWith(collmodif) == coll.endsWith(collmodif)) && - (for (sq <- startEndSeqs) yield { - val sew = s.endsWith(sq) - val cew = coll.endsWith(fromSeq(sq)) - if (sew != cew) { - println("from: " + s) - println("and: " + coll) - println(sew) - println(cew) - } - ("seq " + sq) |: sew == cew - }).reduceLeft(_ && _) - } - - property("unions must be equal") = forAllNoShrink(collectionPairsWithModified) { case (s, coll, collmodif) => - ("modified" |: s.union(collmodif.seq) == coll.union(collmodif)) && - ("empty" |: s.union(Nil) == coll.union(fromSeq(Nil))) - } - - // This is failing with my views patch: array index out of bounds in the array iterator. - // Couldn't see why this and only this was impacted, could use a second pair of eyes. - // - // This was failing because some corner cases weren't added to the patch method in ParSeqLike. - // Curiously, this wasn't detected before. - // - if (!isCheckingViews) property("patches must be equal") = forAll(collectionTripletsWith2Indices) { - case (s, coll, pat, from, repl) => - ("with seq" |: s.patch(from, pat, repl) == coll.patch(from, pat, repl)) && - ("with par" |: s.patch(from, pat, repl) == coll.patch(from, fromSeq(pat), repl)) && - ("with empty" |: s.patch(from, Nil, repl) == coll.patch(from, fromSeq(Nil), repl)) && - ("with one" |: (s.length == 0 || s.patch(from, List(s(0)), 1) == coll.patch(from, fromSeq(List(coll(0))), 1))) - } - - if (!isCheckingViews) property("updates must be equal") = forAllNoShrink(collectionPairsWithLengths) { case (s, coll, len) => - val pos = if (len >= s.length) s.length - 1 else len - if (s.length > 0) { - val supd = s.updated(pos, s(0)) - val cupd = coll.updated(pos, coll(0)) - if (supd != cupd) { - println("from: " + s) - println("and: " + coll) - println(supd) - println(cupd) - } - "from first" |: (supd == cupd) - } else "trivially" |: true - } - - property("prepends must be equal") = forAllNoShrink(collectionPairs) { case (s, coll) => - s.length == 0 || s(0) +: s == coll(0) +: coll - } - - property("appends must be equal") = forAllNoShrink(collectionPairs) { case (s, coll) => - s.length == 0 || s :+ s(0) == coll :+ coll(0) - } - - property("padTos must be equal") = forAllNoShrink(collectionPairsWithLengths) { case (s, coll, len) => - val someValue = sampleValue - val sdoub = s.padTo(len * 2, someValue) - val cdoub = coll.padTo(len * 2, someValue) - if (sdoub != cdoub) { - println("from: " + s) - println("and: " + coll) - println(sdoub) - println(cdoub) - } - ("smaller" |: s.padTo(len / 2, someValue) == coll.padTo(len / 2, someValue)) && - ("bigger" |: sdoub == cdoub) - } - - property("corresponds must be equal") = forAllNoShrink(collectionPairsWithModified) { case (s, coll, modified) => - val modifcut = modified.toSeq.slice(0, modified.length) - ("self" |: s.corresponds(s)(_ == _) == coll.corresponds(coll)(_ == _)) && - ("modified" |: s.corresponds(modified.seq)(_ == _) == coll.corresponds(modified)(_ == _)) && - ("modified2" |: s.corresponds(modifcut)(_ == _) == coll.corresponds(modifcut)(_ == _)) - } - -} - - - - - - - - - - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/ParallelSetCheck.scala b/test/files/scalacheck/parallel-collections/ParallelSetCheck.scala deleted file mode 100644 index c22dddf96d..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelSetCheck.scala +++ /dev/null @@ -1,62 +0,0 @@ -package scala.collection.parallel - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties - -import scala.collection._ -import scala.collection.parallel._ - - - - -abstract class ParallelSetCheck[T](collname: String) extends ParallelIterableCheck[T](collname) { - type CollType <: ParSet[T] - - property("gets iterated keys") = forAllNoShrink(collectionPairs) { - case (t, coll) => - val containsT = for (elem <- t) yield (coll.contains(elem)) - val containsSelf = for (elem <- coll) yield (coll.contains(elem)) - ("Par contains elements of seq map" |: containsT.forall(_ == true)) && - ("Par contains elements of itself" |: containsSelf.forall(_ == true)) - } - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/files/scalacheck/parallel-collections/ParallelVectorCheck.scala b/test/files/scalacheck/parallel-collections/ParallelVectorCheck.scala deleted file mode 100644 index bbebd51919..0000000000 --- a/test/files/scalacheck/parallel-collections/ParallelVectorCheck.scala +++ /dev/null @@ -1,67 +0,0 @@ -package scala.collection -package parallel.immutable - - - -import org.scalacheck._ -import org.scalacheck.Gen -import org.scalacheck.Gen._ -import org.scalacheck.Prop._ -import org.scalacheck.Properties -import org.scalacheck.Arbitrary._ - -import scala.collection._ -import scala.collection.parallel.ops._ - - -import immutable.Vector -import immutable.VectorBuilder - -import scala.collection.parallel.TaskSupport - - - - -abstract class ParallelVectorCheck[T](tp: String) extends collection.parallel.ParallelSeqCheck[T]("ParVector[" + tp + "]") { - // ForkJoinTasks.defaultForkJoinPool.setMaximumPoolSize(Runtime.getRuntime.availableProcessors * 2) - // ForkJoinTasks.defaultForkJoinPool.setParallelism(Runtime.getRuntime.availableProcessors * 2) - - type CollType = ParVector[T] - - def isCheckingViews = false - - def hasStrictOrder = true - - def tasksupport: TaskSupport - - def ofSize(vals: Seq[Gen[T]], sz: Int) = { - val vb = new immutable.VectorBuilder[T]() - val gen = vals(rnd.nextInt(vals.size)) - for (i <- 0 until sz) vb += sample(gen) - vb.result - } - - def fromSeq(a: Seq[T]) = { - val pc = ParVector.newCombiner[T] - for (elem <- a.toList) pc += elem - val pv = pc.result - pv.tasksupport = tasksupport - pv - } - -} - - - -class IntParallelVectorCheck(val tasksupport: TaskSupport) extends ParallelVectorCheck[Int]("Int") with IntSeqOperators with IntValues { - override def instances(vals: Seq[Gen[Int]]) = oneOf(super.instances(vals), sized { sz => - (0 until sz).toArray.toSeq - }, sized { sz => - (-sz until 0).toArray.toSeq - }) -} - - - - - diff --git a/test/files/scalacheck/parallel-collections/pc.scala b/test/files/scalacheck/parallel-collections/pc.scala deleted file mode 100644 index a3c1df4054..0000000000 --- a/test/files/scalacheck/parallel-collections/pc.scala +++ /dev/null @@ -1,71 +0,0 @@ -/* - * scalac: -deprecation - * scalacheck: -workers 1 -minSize 0 -maxSize 4000 -minSuccessfulTests 5 - */ - -import org.scalacheck._ -import scala.collection.parallel._ - -// package here to be able access the package-private implementation and shutdown the pool -package scala { - - class ParCollProperties extends Properties("Parallel collections") { - - def includeAllTestsWith(support: TaskSupport) { - // parallel arrays with default task support - include(new mutable.IntParallelArrayCheck(support)) - - // parallel ranges - include(new immutable.ParallelRangeCheck(support)) - - // parallel immutable hash maps (tries) - include(new immutable.IntIntParallelHashMapCheck(support)) - - // parallel immutable hash sets (tries) - include(new immutable.IntParallelHashSetCheck(support)) - - // parallel mutable hash maps (tables) - include(new mutable.IntIntParallelHashMapCheck(support)) - - // parallel ctrie - include(new mutable.IntIntParallelConcurrentTrieMapCheck(support)) - - // parallel mutable hash sets (tables) - include(new mutable.IntParallelHashSetCheck(support)) - - // parallel vectors - include(new immutable.IntParallelVectorCheck(support)) - } - - includeAllTestsWith(defaultTaskSupport) - - val ec = scala.concurrent.ExecutionContext.fromExecutorService(java.util.concurrent.Executors.newFixedThreadPool(5)) - val ectasks = new collection.parallel.ExecutionContextTaskSupport(ec) - includeAllTestsWith(ectasks) - - // no post test hooks in scalacheck, so cannot do: - // ec.shutdown() - - } - -} - - -object Test extends scala.ParCollProperties { - /* - def main(args: Array[String]) { - val pc = new ParCollProperties - org.scalacheck.Test.checkProperties( - org.scalacheck.Test.Params( - rng = new java.util.Random(5134L), - testCallback = new ConsoleReporter(0), - workers = 1, - minSize = 0, - maxSize = 4000, - minSuccessfulTests = 5 - ), - pc - ) - } - */ -} diff --git a/test/files/scalacheck/primitive-eqeq.scala b/test/files/scalacheck/primitive-eqeq.scala deleted file mode 100644 index 60fe63c207..0000000000 --- a/test/files/scalacheck/primitive-eqeq.scala +++ /dev/null @@ -1,37 +0,0 @@ -import org.scalacheck._ -import Prop._ -import Gen._ - -object Test extends Properties("==") { - def equalObjectsEqualHashcodes(x: Any, y: Any) = (x != y) || (x == y && x.## == y.##) - - // ticket #2087 - property("short/char") = forAll { (x: Short) => { - val ch: Char = x.toChar - (x == ch) == (ch == x) - } - } - - property("symmetry") = forAll { (x: AnyVal, y: AnyVal) => (x == y) == (y == x) } - property("transitivity") = forAll { (x: AnyVal, y: AnyVal, z: AnyVal) => x != y || y != z || x == z } - - property("##") = forAll { - (x: Short) => { - val anyvals = List(x.toByte, x.toChar, x, x.toInt, x.toLong, x.toFloat, x.toDouble, BigInt(x), BigDecimal(x)) - val shortAndLarger = anyvals drop 2 - - val result = ( - ((anyvals, anyvals).zipped forall equalObjectsEqualHashcodes) && - ((shortAndLarger, shortAndLarger).zipped forall (_ == _)) && - ((shortAndLarger, shortAndLarger).zipped forall ((x, y) => (x: Any) == (y: Any))) - ) - result - } - } - property("## 2") = forAll { - (dv: Double) => { - val fv = dv.toFloat - (fv != dv) || (fv.## == dv.##) - } - } -} diff --git a/test/files/scalacheck/quasiquotes/ArbitraryTreesAndNames.scala b/test/files/scalacheck/quasiquotes/ArbitraryTreesAndNames.scala deleted file mode 100644 index ab1056dd86..0000000000 --- a/test/files/scalacheck/quasiquotes/ArbitraryTreesAndNames.scala +++ /dev/null @@ -1,295 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, internal._, Flag._ - -trait ArbitraryTreesAndNames { - def smallList[T](size: Int, g: Gen[T]) = { - val n: Int = choose(0, size / 2 + 1).sample match { - case Some(i) => i - case None => 0 - } - containerOfN[List, T](n, g) - } - - def shortIdent(len: Int) = - for(name <- identifier) - yield if(name.length <= len) name - else name.substring(0, len - 1) - - def genTermName = for(name <- shortIdent(8)) yield TermName(name) - def genTypeName = for(name <- shortIdent(8)) yield TypeName(name) - def genName = oneOf(genTermName, genTypeName) - - def genFlagSet = oneOf( - TRAIT, INTERFACE, MUTABLE, MACRO, - DEFERRED, ABSTRACT, FINAL, SEALED, - IMPLICIT, LAZY, OVERRIDE, PRIVATE, - PROTECTED, LOCAL, CASE, ABSOVERRIDE, - BYNAMEPARAM, PARAM, COVARIANT, CONTRAVARIANT, - DEFAULTPARAM, PRESUPER, DEFAULTINIT - ) - - def genModifiers = for(flagset <- genFlagSet) yield Modifiers(flagset) - - def genConstant = - for(value <- oneOf(arbitrary[Byte], arbitrary[Short], arbitrary[Char], - arbitrary[Int], arbitrary[Long], arbitrary[Float], - arbitrary[Double], arbitrary[Boolean], arbitrary[String])) - yield Constant(value) - - def genAnnotated(size: Int, argGen: Int => Gen[Tree]) = - for(annot <- genTree(size - 1); arg <- argGen(size - 1)) - yield Annotated(annot, arg) - - def genAlternative(size: Int): Gen[Alternative] = - for(trees <- smallList(size, genTree(size - 1))) - yield Alternative(trees) - - def genAppliedTypeTree(size: Int) = - for(tpt <- genTree(size - 1) if tpt.isType; - args <- smallList(size, genTree(size - 1))) - yield AppliedTypeTree(tpt, args) - - def genApply(size: Int) = - for(fun <- genTree(size - 1); - args <- smallList(size, genTree(size - 1))) - yield Apply(fun, args) - - def genAssign(size: Int) = - for(lhs <- genTree(size - 1); rhs <- genTree(size - 1)) - yield Assign(lhs, rhs) - - def genAssignOrNamedArg(size: Int) = - for(lhs <- genTree(size - 1); rhs <- genTree(size - 1)) - yield AssignOrNamedArg(lhs, rhs) - - def genBind(size: Int, nameGen: Gen[Name]) = - for(name <- nameGen; body <- genTree(size - 1)) - yield Bind(name, body) - - def genBlock(size: Int) = - for(stats <- smallList(size, genTree(size - 1)); expr <- genTree(size - 1)) - yield Block(stats, expr) - - def genCaseDef(size: Int) = - for(pat <- genTree(size - 1); guard <- genTree(size - 1); body <- genTree(size - 1)) - yield CaseDef(pat, guard, body) - - def genClassDef(size: Int) = - for(mods <- genModifiers; name <- genTypeName; - tparams <- smallList(size, genTypeDef(size - 1)); - impl <- genTemplate(size - 1)) - yield ClassDef(mods, name, tparams, impl) - - def genCompoundTypeTree(size: Int) = - for(templ <- genTemplate(size - 1)) - yield CompoundTypeTree(templ) - - def genDefDef(size: Int) = - for(mods <- genModifiers; name <- genTermName; - tpt <- genTree(size -1); rhs <- genTree(size - 1); - tparams <- smallList(size, genTypeDef(size - 1)); - vparamss <- smallList(size, smallList(size, genValDef(size - 1)))) - yield DefDef(mods, name, tparams, vparamss, tpt, rhs) - - def genExistentialTypeTree(size: Int) = - for(tpt <- genTree(size - 1); where <- smallList(size, oneOf(genValDef(size - 1), genTypeDef(size - 1)))) - yield ExistentialTypeTree(tpt, where) - - def genFunction(size: Int) = - for(vparams <- smallList(size, genValDef(size - 1)); body <- genTree(size - 1)) - yield Function(vparams, body) - - def genIdent(nameGen: Gen[Name] = genName) = - for(name <- nameGen) yield Ident(name) - - def genIf(size: Int) = - for(cond <- genTree(size - 1); thenp <- genTree(size - 1); elsep <- genTree(size - 1)) - yield If(cond, thenp, elsep) - - def genImport(size: Int) = - for(expr <- genTree(size - 1); selectors <- smallList(size, genImportSelector(size - 1))) - yield Import(expr, selectors) - - def genImportSelector(size: Int) = - for(name <- genName; namePos <- arbitrary[Int]; rename <- genName; renamePos <- arbitrary[Int]) - yield ImportSelector(name, namePos, rename, renamePos) - - def genTemplate(size: Int) = - for(parents <- smallList(size, genTree(size - 1)); - self <- genValDef(size - 1); - body <- smallList(size, genTree(size - 1))) - yield Template(parents, self, body) - - def genLabelDef(size: Int) = - for(name <- genTermName; params <- smallList(size, genIdent()); rhs <- genTree(size - 1)) - yield LabelDef(name, params, rhs) - - def genLiteral = - for(const <- genConstant) yield Literal(const) - - def genMatch(size: Int) = - for(selector <- genTree(size - 1); cases <- smallList(size, genCaseDef(size - 1))) - yield Match(selector, cases) - - def genModuleDef(size: Int) = - for(mods <- genModifiers; name <- genTermName; impl <- genTemplate(size - 1)) - yield ModuleDef(mods, name, impl) - - def genNew(size: Int) = - for(tpt <- genTree(size - 1)) - yield New(tpt) - - def genRefTree(size: Int) = - oneOf(genSelect(size), genIdent(), genSelectFromTypeTree(size)) - - def genPackageDef(size: Int) = - for(reftree <- genRefTree(size - 1); stats <- smallList(size, genTree(size - 1))) - yield PackageDef(reftree, stats) - - def genTypeSelect(size: Int) = - for(qual <- genTree(size - 1); name <- genTypeName) - yield Select(qual, name) - - def genSelect(size: Int, nameGen: Gen[Name] = genName) = - for(qual <- genTree(size - 1); name <- nameGen) - yield Select(qual, name) - - def genSelectFromTypeTree(size: Int) = - for(qual <- genTreeIsType(size - 1); name <- genTypeName) - yield SelectFromTypeTree(qual, name) - - def genReferenceToBoxed(size: Int) = - for(ident <- genIdent()) - yield ReferenceToBoxed(ident) - - def genReturn(size: Int) = - for(expr <- genTree(size - 1)) - yield Return(expr) - - def genSingletonTypeTree(size: Int) = - for(expr <- genTree(size - 1)) - yield SingletonTypeTree(expr) - - def genStar(size: Int) = - for(expr <- genTree(size - 1)) - yield Star(expr) - - def genSuper(size: Int) = - for(qual <- genTree(size - 1); mix <- genTypeName) - yield Super(qual, mix) - - def genThis(size: Int) = - for(qual <- genTypeName) - yield This(qual) - - def genThrow(size: Int) = - for(expr <- genTree(size - 1)) - yield Throw(expr) - - def genTry(size: Int) = - for(block <- genTree(size - 1); - catches <- smallList(size, genCaseDef(size - 1)); - finalizer <- genTree(size - 1)) - yield Try(block, catches, finalizer) - - def genTypeApply(size: Int) = - for(fun <- genTreeIsTerm(size - 1); args <- smallList(size, genTree(size - 1))) - yield TypeApply(fun, args) - - def genTypeBoundsTree(size: Int) = - for(lo <- genTree(size - 1); hi <- genTree(size - 1)) - yield TypeBoundsTree(lo, hi) - - def genTypeDef(size: Int): Gen[TypeDef] = - for(mods <- genModifiers; name <- genTypeName; - tparams <- smallList(size, genTypeDef(size - 1)); rhs <- genTree(size - 1)) - yield TypeDef(mods, name, tparams, rhs) - - def genTypeTree: Gen[TypeTree] = TypeTree() - - def genTyped(size: Int) = - for(expr <- genTree(size - 1); tpt <- genTree(size - 1)) - yield Typed(expr, tpt) - - def genUnApply(size: Int) = - for(fun <- genTree(size - 1); args <- smallList(size, genTree(size - 1))) - yield UnApply(fun, args) - - def genValDef(size: Int) = - for(mods <- genModifiers; name <- genTermName; - tpt <- genTree(size - 1); rhs <- genTree(size - 1)) - yield ValDef(mods, name, tpt, rhs) - - def genTree(size: Int): Gen[Tree] = - if (size <= 1) oneOf(EmptyTree: Gen[Tree], genTreeIsTerm(size), genTreeIsType(size)) - else oneOf(genTree(1), - // these trees are neither terms nor types - genPackageDef(size - 1), genModuleDef(size - 1), - genCaseDef(size - 1), genDefDef(size - 1), - genTypeDef(size - 1), genTemplate(size - 1), - genClassDef(size - 1), genValDef(size - 1), - genImport(size - 1)) - - def genTreeIsTerm(size: Int): Gen[Tree] = - if (size <= 1) oneOf(genLiteral, genIdent(genTermName)) - else oneOf(genTreeIsTerm(1), genBind(size - 1, genTermName), - genAnnotated(size - 1, genTreeIsTerm), genSelect(size - 1, genTermName), - genAlternative(size - 1), genApply(size - 1), genAssign(size - 1), - genAssignOrNamedArg(size - 1), genBlock(size - 1), genFunction(size - 1), - genIf(size - 1), genLabelDef(size - 1), genMatch(size - 1), genNew(size - 1), - genReturn(size - 1), genStar(size - 1), genSuper(size - 1), genThis(size - 1), - genThrow(size - 1), genTry(size - 1), genTypeApply(size - 1), - genTyped(size - 1), genUnApply(size - 1)) - - def genTreeIsType(size: Int): Gen[Tree] = - if (size <= 1) genIdent(genTypeName) - else oneOf(genTreeIsType(1), genAnnotated(size - 1, genTreeIsType), - genBind(size - 1, genTypeName), genSelect(size - 1, genTypeName), - genSingletonTypeTree(size - 1), genSelectFromTypeTree(size - 1), - genExistentialTypeTree(size - 1), genCompoundTypeTree(size - 1), - genAppliedTypeTree(size - 1), genTypeBoundsTree(size - 1)) - - /* These are marker types that allow to write tests that - * depend specifically on Trees that are terms or types. - * They are transparently transformed to trees through - * implicit conversions and liftables for quasiquotes. - */ - - case class TreeIsTerm(tree: Tree) { require(tree.isTerm, showRaw(tree)) } - case class TreeIsType(tree: Tree) { require(tree.isType, showRaw(tree)) } - - def genTreeIsTermWrapped(size: Int) = - for(tit <- genTreeIsTerm(size)) yield TreeIsTerm(tit) - - def genTreeIsTypeWrapped(size: Int) = - for(tit <- genTreeIsType(size)) yield TreeIsType(tit) - - implicit val liftTreeIsTerm = Liftable[TreeIsTerm] { _.tree } - implicit val liftTreeIsType = Liftable[TreeIsType] { _.tree } - implicit def treeIsTerm2tree(tit: TreeIsTerm): Tree = tit.tree - implicit def treeIsType2tree(tit: TreeIsType): Tree = tit.tree - - implicit val arbConstant: Arbitrary[Constant] = Arbitrary(genConstant) - implicit val arbModifiers: Arbitrary[Modifiers] = Arbitrary(genModifiers) - implicit val arbTermName: Arbitrary[TermName] = Arbitrary(genTermName) - implicit val arbTypeName: Arbitrary[TypeName] = Arbitrary(genTypeName) - implicit val arbName: Arbitrary[Name] = Arbitrary(genName) - - // Trees generators are bound by this size to make - // generation times shorter and less memory hungry. - // TODO: is there any better solution? - val maxTreeSize = 5 - - def arbitrarySized[T](gen: Int => Gen[T]) = - Arbitrary(sized(s => gen(s.min(maxTreeSize)))) - - implicit val arbLiteral: Arbitrary[Literal] = Arbitrary(genLiteral) - implicit val arbIdent: Arbitrary[Ident] = Arbitrary(genIdent()) - implicit val arbValDef: Arbitrary[ValDef] = arbitrarySized(genValDef) - implicit val arbDefDef: Arbitrary[DefDef] = arbitrarySized(genDefDef) - implicit val arbTypeDef: Arbitrary[TypeDef] = arbitrarySized(genTypeDef) - implicit val arbBind: Arbitrary[Bind] = arbitrarySized(genBind(_, genName)) - implicit val arbTree: Arbitrary[Tree] = arbitrarySized(genTree) - implicit val arbTreeIsTerm: Arbitrary[TreeIsTerm] = arbitrarySized(genTreeIsTermWrapped) - implicit val arbTreeIsType: Arbitrary[TreeIsType] = arbitrarySized(genTreeIsTypeWrapped) -}
\ No newline at end of file diff --git a/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala b/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala deleted file mode 100644 index 4ab8bb8531..0000000000 --- a/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala +++ /dev/null @@ -1,453 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._, internal.reificationSupport.ScalaDot - -object DefinitionConstructionProps - extends QuasiquoteProperties("definition construction") - with ClassConstruction - with TraitConstruction - with TypeDefConstruction - with ValDefConstruction - with PatDefConstruction - with DefConstruction - with PackageConstruction - with ImportConstruction { - - val x: Tree = q"val x: Int" - property("SI-6842 a1") = test { assertEqAst(q"def f($x) = 0", "def f(x: Int) = 0") } - property("SI-6842 a2") = test { assertEqAst(q"class C($x)", "class C(val x: Int)") } - property("SI-6842 a3") = test { assertEqAst(q"class C { $x => }", "class C { x: Int => }") } - property("SI-6842 a4") = test { assertEqAst(q"trait B { $x => }", "trait B { x: Int => }") } - property("SI-6842 a5") = test { assertEqAst(q"object A { $x => }", "object A { x: Int => }") } - - val t: Tree = q"type T" - property("SI-6842 b1") = test { assertEqAst(q"def f[$t] = 0", "def f[T] = 0") } - property("SI-6842 b2") = test { assertEqAst(q"class C[$t]", "class C[T]") } - property("SI-6842 b3") = test { assertEqAst(q"trait B[$t]", "trait B[T]") } -} - -trait ClassConstruction { self: QuasiquoteProperties => - val anyRef = ScalaDot(TypeName("AnyRef")) - val emtpyConstructor = - DefDef(Modifiers(), termNames.CONSTRUCTOR, List(), - List(List()), TypeTree(), Block(List(pendingSuperCall), Literal(Constant(())))) - def classWith(name: TypeName, parents: List[Tree] = List(anyRef), body: List[DefDef] = Nil) = - ClassDef( - Modifiers(), name, List(), - Template(parents, emptyValDef, emtpyConstructor :: body)) - - property("construct case class") = test { - val params = q"val x: Int" :: q"val y: Int" :: Nil - val name = TypeName("Point") - assertEqAst(q"$CASE class $name(..$params)", "case class Point(x: Int, y: Int)") - } - - property("case class bare param") = test { - assertEqAst(q"$CASE class Point(x: Int, y: Int)", "case class Point(private[this] val x: Int, private[this] val y: Int)") - } - - property("generate default constructors automatically") = test { - val parents = List.empty[Tree] - assertEqAst(q"class Foo extends ..$parents", "class Foo") - } - - property("unquote term name into class") = forAll { (rname: TypeName) => - // add prefix to avoid failure in case rname is keyword - val name = TypeName("prefix$" + rname) - eqAst(q"class $name", "class " + name.toString) - } - - property("unquote method into class") = forAll { (name: TypeName, method: DefDef) => - q"class $name { $method }" ≈ classWith(name, body = List(method)) - } - - property("unquote members into class") = forAll { (name: TypeName, defs: List[DefDef], extra: DefDef) => - q"""class $name { - ..$defs - $extra - }""" ≈ classWith(name, body = defs :+ extra) - } - - property("unquote type name into class parents") = forAll { (name: TypeName, parent: TypeName) => - q"class $name extends $parent" ≈ classWith(name, parents = List(Ident(parent))) - } - - property("param flags are consistent with raw code") = test { - val pubx = q"val x: Int" - val privx = q"private[this] val x: Int" - assertEqAst(q" class C(x: Int)", " class C(x: Int) ") - assertEqAst(q"case class C(x: Int)", "case class C(x: Int) ") - assertEqAst(q" class C($pubx) ", " class C(val x: Int) ") - assertEqAst(q"case class C($pubx) ", "case class C(x: Int) ") - assertEqAst(q" class C($privx)", " class C(x: Int) ") - assertEqAst(q"case class C($privx)", "case class C(private[this] val x: Int)") - } - - property("SI-8333") = test { - assertEqAst(q"{ $NoMods class C }", "{ class C }") - } - - property("SI-8332") = test { - val args = q"val a: Int; val b: Int" - assertEqAst(q"class C(implicit ..$args)", "class C(implicit val a: Int, val b: Int)") - } - - property("SI-8451: inline secondary constructors") = test { - assertEqAst(q"class C(x: Int) { def this() = this(0) }", "class C(x: Int) { def this() = this(0) }") - } - - property("SI-8451: unquoted secondary constructors") = test { - val secondaryCtor = q"def this() = this(0)" - assertEqAst(q"class C(x: Int) { $secondaryCtor }", "class C(x: Int) { def this() = this(0) }") - } -} - -trait TraitConstruction { self: QuasiquoteProperties => - property("unquote name into trait def") = test { - val Foo = TypeName("Foo") - assert(q"trait $Foo" ≈ q"trait Foo") - } - - property("unquote type params into trait def") = test { - val tparams = q"type A" :: q"type B" :: Nil - assert(q"trait Foo[..$tparams]" ≈ q"trait Foo[A, B]") - } - - property("unquote defs into trait body") = test { - val body = q"def foo" :: q"val bar: Baz" :: Nil - assert(q"trait Foo { ..$body }" ≈ q"trait Foo { def foo; val bar: Baz }") - } - - property("unquote parents into trait") = test { - val parents = tq"A" :: tq"B" :: Nil - assert(q"trait Foo extends ..$parents" ≈ q"trait Foo extends A with B") - } - - property("unquote early valdef into trait") = test { - val x = q"val x: Int = 1" - assertEqAst(q"trait T extends { $x } with Any", "trait T extends { val x: Int = 1} with Any") - } - - property("construct trait with early valdef") = test { - assertEqAst(q"trait T extends { val x: Int = 1 } with Any", "trait T extends { val x: Int = 1 } with Any") - } - - property("unquote defs into early block") = test { - val defs = q"val x: Int = 0" :: q"type Foo = Bar" :: Nil - assert(q"trait T extends { ..$defs } with Bippy" ≈ - q"trait T extends { val x: Int = 0; type Foo = Bar} with Bippy") - } - - property("fail on splicing of non-valid early tree") = test { - val defn = q"def x: Int = 0" - assertThrows[IllegalArgumentException] { q"trait T extends { $defn } with Bar" } - } -} - -trait TypeDefConstruction { self: QuasiquoteProperties => - property("unquote type name into typedef") = forAll { (name1: TypeName, name2: TypeName) => - q"type $name1 = $name2" ≈ TypeDef(Modifiers(), name1, List(), Ident(name2)) - } - - property("unquote type names into type bounds") = forAll { (T1: TypeName, T2: TypeName, T3: TypeName) => - q"type $T1 >: $T2 <: $T3" ≈ - TypeDef( - Modifiers(DEFERRED), T1, List(), - TypeBoundsTree(Ident(T2), Ident(T3))) - } - - property("unquote trees names into type bounds") = forAll { (T: TypeName, t1: Tree, t2: Tree) => - q"type $T >: $t1 <: $t2" ≈ - TypeDef( - Modifiers(DEFERRED), T, List(), - TypeBoundsTree(t1, t2)) - } - - property("unquote tparams into typedef (1)") = forAll { (T: TypeName, targs: List[TypeDef], t: Tree) => - q"type $T[..$targs] = $t" ≈ TypeDef(Modifiers(), T, targs, t) - } - - property("unquote tparams into typedef (2)") = forAll { (T: TypeName, targs1: List[TypeDef], targs2: List[TypeDef], t: Tree) => - q"type $T[..$targs1, ..$targs2] = $t" ≈ TypeDef(Modifiers(), T, targs1 ++ targs2, t) - } - - property("unquote tparams into typedef (3)") = forAll { (T: TypeName, targ: TypeDef, targs: List[TypeDef], t: Tree) => - q"type $T[$targ, ..$targs] = $t" ≈ TypeDef(Modifiers(), T, targ :: targs, t) - } - - property("unquote typename into typedef with default bounds") = forAll { (T1: TypeName, T2: TypeName, t: Tree) => - q"type $T1[$T2 >: Any <: Nothing] = $t" ≈ - TypeDef( - Modifiers(), T1, - List(TypeDef( - Modifiers(PARAM), T2, - List(), - TypeBoundsTree( - Ident(TypeName("Any")), - Ident(TypeName("Nothing"))))), - t) - } - - property("unquote type names into compound type tree") = forAll { (T: TypeName, A: TypeName, B: TypeName) => - q"type $T = $A with $B" ≈ - TypeDef( - Modifiers(), T, List(), - CompoundTypeTree( - Template(List(Ident(A), Ident(B)), ValDef(Modifiers(PRIVATE), termNames.WILDCARD, TypeTree(), EmptyTree), List()))) - } - - property("unquote trees into existential type tree") = forAll { - (T1: TypeName, T2: TypeName, X: TypeName, Lo: TypeName, Hi: TypeName) => - - q"type $T1 = $T2[$X] forSome { type $X >: $Lo <: $Hi }" ≈ - TypeDef( - Modifiers(), T1, List(), - ExistentialTypeTree( - AppliedTypeTree(Ident(T2), List(Ident(X))), - List( - TypeDef(Modifiers(DEFERRED), X, List(), TypeBoundsTree(Ident(Lo), Ident(Hi)))))) - } - - property("unquote tree into singleton type tree") = forAll { (name: TypeName, t: Tree) => - q"type $name = $t.type" ≈ q"type $name = ${SingletonTypeTree(t)}" - } - - property("unquote into applied type tree") = forAll { (T1: TypeName, T2: TypeName, args: List[Tree]) => - q"type $T1 = $T2[..$args]" ≈ - TypeDef(Modifiers(), T1, List(), - if(args.nonEmpty) AppliedTypeTree(Ident(T2), args) else Ident(T2)) - } -} - -trait ValDefConstruction { self: QuasiquoteProperties => - property("unquote into val") = forAll { (name: TermName, tpt: Tree, rhs: Tree) => - q"val $name: $tpt = $rhs" ≈ ValDef(Modifiers(), name, tpt, rhs) - } - - property("unquote into var") = forAll { (name: TermName, tpt: Tree, rhs: Tree) => - q"var $name: $tpt = $rhs" ≈ ValDef(Modifiers(MUTABLE), name, tpt, rhs) - } - - // left tree is not a pattern due to Si-8211 - property("SI-8202") = test { - assertEqAst(q"val (x: Int) = 1", "val x: Int = 1") - } -} - -trait PatDefConstruction { self: QuasiquoteProperties => - property("unquote pattern into pat def") = test { - val pat = pq"(a, b)" - assertEqAst(q"val $pat = (1, 2)", "val (a, b) = (1, 2)") - val tpt = tq"(Int, Int)" - assertEqAst(q"val $pat: $tpt = (1, 2)", "val (a, b): (Int, Int) = (1, 2)") - } - - property("unquote pattern into pat def within other pattern (1)") = test { - val pat = pq"(a, b)" - assertEqAst(q"val Foo($pat) = Foo((1, 2))", "val Foo((a, b)) = Foo((1, 2))") - val tpt = tq"Foo" - assertEqAst(q"val Foo($pat): $tpt = Foo((1, 2))", "val Foo((a, b)): Foo = Foo((1, 2))") - } - - property("unquote patterns into pat def within other pattern (2)") = test { - val pat1 = pq"(a, b)"; val pat2 = pq"(c, d)" - assertEqAst(q"val ($pat1, $pat2) = ((1, 2), (3, 4))", "val ((a, b), (c, d)) = ((1, 2), (3, 4))") - val tpt = tq"((Int, Int), (Int, Int))" - assertEqAst(q"val ($pat1, $pat2): $tpt = ((1, 2), (3, 4))", "val ((a, b), (c, d)): ((Int, Int), (Int, Int)) = ((1, 2), (3, 4))") - } - - property("unquote pattern without free vars into pat def") = test { - val pat = pq"((1, 2), 3)" - assertEqAst(q"val $pat = ((1, 2), 3)", "{ val ((1, 2), 3) = ((1, 2), 3) }") - val tpt = tq"((Int, Int), Int)" - assertEqAst(q"val $pat: $tpt = ((1, 2), 3)","{ val ((1, 2), 3): ((Int, Int), Int) = ((1, 2), 3) }") - } - - // won't result into pattern match due to SI-8211 - property("unquote typed pat into pat def") = test { - val pat = pq"x: Int" - assertEqAst(q"val $pat = 2", "{ val x: Int = 2 }") - } -} - -trait MethodConstruction { self: QuasiquoteProperties => - property("unquote paramss into defdef") = test { - val paramss = List(q"val x: Int") :: List(q"val y: Int = 1") :: Nil - assert(q"def foo(...$paramss)" ≈ parse("def foo(x: Int)(y: Int = 1)")) - } - - property("unquote tparams into defdef") = test { - val tparams = q"type A" :: q"type B <: Bippy" :: Nil - assert(q"def foo[..$tparams]" ≈ parse("def foo[A, B <: Bippy]")) - } - - def assertSameAnnots(tree: {def mods: Modifiers}, annots: List[Tree]) = - assert(tree.mods.annotations ≈ annots, - s"${tree.mods.annotations} =/= ${annots}") - - def assertSameAnnots(tree1: {def mods: Modifiers}, tree2: {def mods: Modifiers}) = - assert(tree1.mods.annotations ≈ tree2.mods.annotations, - s"${tree1.mods.annotations} =/= ${tree2.mods.annotations}") - - property("unquote type name into annotation") = test { - val name = TypeName("annot") - assertSameAnnots(q"@$name def foo", List(q"new $name")) - } - - property("unquote ident into annotation") = test { - val name = TypeName("annot") - val ident = Ident(name) - assertSameAnnots(q"@$ident def foo", List(q"new $name")) - } - - property("unquote idents into annotation") = test { - val idents = List(Ident(TypeName("annot1")), Ident(TypeName("annot2"))) - assertSameAnnots(q"@..$idents def foo", - idents.map { ident => Apply(Select(New(ident), termNames.CONSTRUCTOR), List()) }) - } - - property("unquote constructor calls into annotation") = test { - val ctorcalls = List(q"new a1", q"new a2") - assertSameAnnots(q"@..$ctorcalls def foo", ctorcalls) - } - - property("unquote multiple annotations (1)") = test { - val annot1 = q"new a1" - val annot2 = q"new a2" - val res = q"@$annot1 @$annot2 def foo" - assertSameAnnots(res, List(annot1, annot2)) - } - - property("unquote multiple annotations (2)") = test { - val annot1 = q"new a1" - val annots = List(q"new a2", q"new a3") - val res = q"@$annot1 @..$annots def foo" - assertSameAnnots(res, annot1 :: annots) - } - - property("unquote annotations with arguments (1)") = test { - val a = q"new a(x)" - assertSameAnnots(q"@$a def foo", q"@a(x) def foo") - } - - property("unquote annotations with arguments (2)") = test { - val a = TypeName("a") - assertSameAnnots(q"@$a(x) def foo", q"@a(x) def foo") - } - - property("unquote annotations with arguments (3") = test { - val a = Ident(TypeName("a")) - assertSameAnnots(q"@$a(x) def foo", q"@a(x) def foo") - } - - property("unquote improper tree into annot") = test { - val t = tq"Foo[Baz]" - assertThrows[IllegalArgumentException] { - q"@$t def foo" - } - } - - property("can't unquote annotations with arguments specified twice") = test { - val a = q"new a(x)" - assertThrows[IllegalArgumentException] { - q"@$a(y) def foo" - } - } - - property("unquote annotation with targs") = test { - val a = q"new Foo[A, B]" - assertEqAst(q"@$a def foo", "@Foo[A,B] def foo") - } - - property("unquote annotation with multiple argument lists") = test { - val a = q"new Foo(a)(b)" - assertEqAst(q"@$a def foo", "@Foo(a)(b) def foo") - } -} - -trait PackageConstruction { self: QuasiquoteProperties => - property("unquote select into package name") = test { - val name = q"foo.bar" - assertEqAst(q"package $name { }", "package foo.bar { }") - } - - property("splice name into package name") = test{ - val name = TermName("bippy") - assertEqAst(q"package $name { }", "package bippy { }") - } - - property("unquote members into package body") = test { - val members = q"class C" :: q"object O" :: Nil - assertEqAst(q"package foo { ..$members }", "package foo { class C; object O }") - } - - property("unquote illegal members into package body") = test { - val f = q"def f" - assertThrows[IllegalArgumentException] { q"package foo { $f }" } - val v = q"val v = 0" - assertThrows[IllegalArgumentException] { q"package foo { $v }" } - val expr = q"x + 1" - assertThrows[IllegalArgumentException] { q"package foo { $expr }" } - } - - property("unquote name into package object") = test { - val foo = TermName("foo") - assertEqAst(q"package object $foo", "package object foo") - } - - property("unquote parents into package object") = test { - val parents = tq"a" :: tq"b" :: Nil - assertEqAst(q"package object foo extends ..$parents", - "package object foo extends a with b") - } - - property("unquote members into package object") = test { - val members = q"def foo" :: q"val x = 1" :: Nil - assertEqAst(q"package object foo { ..$members }", - "package object foo { def foo; val x = 1 }") - } - - property("unquote early def into package object") = test { - val edefs = q"val x = 1" :: q"type I = Int" :: Nil - assertEqAst(q"package object foo extends { ..$edefs } with Any", - "package object foo extends { val x = 1; type I = Int } with Any") - } -} - -trait DefConstruction { self: QuasiquoteProperties => - property("construct implicit args (1)") = test { - val x = q"val x: Int" - assertEqAst(q"def foo(implicit $x) = x", "def foo(implicit x: Int) = x") - } - - property("construct implicit args (2)") = test { - val xs = q"val x1: Int" :: q"val x2: Long" :: Nil - assertEqAst(q"def foo(implicit ..$xs) = x1 + x2", "def foo(implicit x1: Int, x2: Long) = x1 + x2") - } -} - -trait ImportConstruction { self: QuasiquoteProperties => - property("construct wildcard import") = test { - val sel = pq"_" - assert(q"import foo.$sel" ≈ q"import foo._") - } - - property("construct named import") = test { - val sel = pq"bar" - assert(q"import foo.$sel" ≈ q"import foo.bar") - } - - property("construct renaming import") = test { - val sel = pq"bar -> baz" - assert(q"import foo.$sel" ≈ q"import foo.{bar => baz}") - } - - property("construct unimport import") = test { - val sels = pq"poison -> _" :: pq"_" :: Nil - assert(q"import foo.{..$sels}" ≈ q"import foo.{poison => _, _}") - } - - property("construct mixed import") = test { - val sels = pq"a -> b" :: pq"c -> _" :: pq"_" :: Nil - assert(q"import foo.{..$sels}" ≈ q"import foo.{a => b, c => _, _}") - } -} diff --git a/test/files/scalacheck/quasiquotes/DefinitionDeconstructionProps.scala b/test/files/scalacheck/quasiquotes/DefinitionDeconstructionProps.scala deleted file mode 100644 index 2c0e100b5a..0000000000 --- a/test/files/scalacheck/quasiquotes/DefinitionDeconstructionProps.scala +++ /dev/null @@ -1,290 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._, internal.reificationSupport.SyntacticClassDef - -object DefinitionDeconstructionProps - extends QuasiquoteProperties("definition deconstruction") - with TraitDeconstruction - with ClassDeconstruction - with ObjectDeconstruction - with ModsDeconstruction - with ValVarDeconstruction - with DefDeconstruction - with PackageDeconstruction - with ImportDeconstruction - -trait TraitDeconstruction { self: QuasiquoteProperties => - property("exhaustive trait matcher") = test { - def matches(line: String) { - val q"""$mods trait $name[..$targs] - extends { ..$early } with ..$parents { $self => ..$body }""" = parse(line) - } - matches("trait Foo") - matches("trait Foo[T]") - matches("trait Foo { def bar }") - matches("trait Foo extends Bar with Baz") - matches("trait Foo { self: Bippy => val x: Int = 1}") - matches("trait Foo extends { val early: Int = 1 } with Bar { val late = early }") - matches("private[Gap] trait Foo") - } -} - -trait ObjectDeconstruction { self: QuasiquoteProperties => - property("exhaustive object matcher") = test { - def matches(line: String) = { - val q"""$mods object $name extends { ..$early } with ..$parents { $self => ..$body }""" = parse(line) - } - matches("object Foo") - matches("object Foo extends Bar[T]") - matches("object Foo extends { val early: T = v } with Bar") - matches("object Foo extends Foo { selfy => body }") - matches("private[Bippy] object Foo extends Bar with Baz") - } -} - -trait ClassDeconstruction { self: QuasiquoteProperties => - property("class without params") = test { - val q"class $name { ..$body }" = q"class Foo { def bar = 3 }" - assert(body ≈ List(q"def bar = 3")) - } - - property("class constructor") = test { - val q"class $name(...$argss)" = q"class Foo(x: Int)(y: Int)" - assert(argss.length == 2) - } - - property("class parents") = test { - val q"class $name extends ..$parents" = q"class Foo extends Bar with Blah" - assert(parents ≈ List(tq"Bar", tq"Blah")) - } - - property("class selfdef") = test { - val q"class $name { $self => }" = q"class Foo { self: T => }" - assert(self.name ≈ TermName("self") && self.tpt ≈ tq"T") - } - - property("class tparams") = test { - val q"class $name[..$tparams]" = q"class Foo[A, B]" - assert(tparams.map { _.name } == List(TypeName("A"), TypeName("B"))) - } - - property("deconstruct bare case class") = test { - val q"$mods class $name(..$args) extends ..$parents" = q"case class Foo(x: Int)" - } - - property("exhaustive class matcher") = test { - def matches(line: String) { - val tree = parse(line) - val q"""$classMods0 class $name0[..$targs0] $ctorMods0(...$argss0) - extends { ..$early0 } with ..$parents0 { $self0 => ..$body0 }""" = tree - val q"""$classMods1 class $name1[..$targs1] $ctorMods1(...$argss1)(implicit ..$impl) - extends { ..$early1 } with ..$parents1 { $self1 => ..$body1 }""" = tree - } - matches("class Foo") - matches("class Foo[T]") - matches("class Foo[T] @annot") - matches("class Foo extends Bar with Baz") - matches("class Foo { body }") - matches("class Foo extends { val early = 0 } with Any") - matches("abstract class Foo") - matches("private[Baz] class Foo") - matches("class Foo(first: A)(second: B)") - matches("class Foo(first: A) extends Bar(first) with Baz") - matches("class Foo private (first: A) { def bar }") - matches("class Foo { self => bar(self) }") - matches("case class Foo(x: Int)") - } - - property("SI-7979") = test { - val PARAMACCESSOR = (1 << 29).toLong.asInstanceOf[FlagSet] - assertThrows[MatchError] { - val SyntacticClassDef(_, _, _, _, _, _, _, _, _) = - ClassDef( - Modifiers(), TypeName("Foo"), List(), - Template( - List(Select(Ident(TermName("scala")), TypeName("AnyRef"))), - noSelfType, - List( - //ValDef(Modifiers(PRIVATE | LOCAL | PARAMACCESSOR), TermName("x"), Ident(TypeName("Int")), EmptyTree), - DefDef(Modifiers(), termNames.CONSTRUCTOR, List(), List(List(ValDef(Modifiers(PARAM | PARAMACCESSOR), TermName("x"), - Ident(TypeName("Int")), EmptyTree))), TypeTree(), Block(List(pendingSuperCall), Literal(Constant(()))))))) - } - } - - property("SI-8332") = test { - val q"class C(implicit ..$args)" = q"class C(implicit i: I, j: J)" - val q"$imods val i: I" :: q"$jmods val j: J" :: Nil = args - assert(imods.hasFlag(IMPLICIT)) - assert(jmods.hasFlag(IMPLICIT)) - } -} - -trait ModsDeconstruction { self: QuasiquoteProperties => - property("deconstruct mods") = test { - val mods = Modifiers(IMPLICIT | PRIVATE, TermName("foobar"), Nil) - val q"$mods0 def foo" = q"$mods def foo" - assert(mods0 ≈ mods) - } - - property("@$annot def foo") = forAll { (annotName: TypeName) => - val q"@$annot def foo" = q"@$annotName def foo" - annot ≈ Apply(Select(New(Ident(annotName)), termNames.CONSTRUCTOR), List()) - } - - property("@$annot(..$args) def foo") = forAll { (annotName: TypeName, tree: Tree) => - val q"@$annot(..$args) def foo" = q"@$annotName($tree) def foo" - annot ≈ Ident(annotName) && args ≈ List(tree) - } - - property("@..$annots def foo") = test { - val a = q"new a" - val b = q"new b" - val q"@..$annots def foo" = q"@$a @$b def foo" - annots ≈ List(a, b) - } - - property("@$annot @..$annots def foo") = test { - val a = q"new a" - val b = q"new b" - val c = q"new c" - val q"@$first @..$rest def foo" = q"@$a @$b @$c def foo" - assert(first ≈ a) - assert(rest ≈ List(b, c)) - } - - property("@..$anots @$annot def foo") = test { - val a = q"new a" - val b = q"new b" - val c = q"new c" - val q"@..$init @$last def foo" = q"@$a @$b @$c def foo" - assert(init ≈ List(a, b)) - assert(last ≈ c) - } -} - -trait ValVarDeconstruction { self: QuasiquoteProperties => - property("exhaustive val matcher") = test { - def matches(line: String) { val q"$mods val $name: $tpt = $rhs" = parse(line) } - matches("val x: Int") - matches("val x: Int = 1") - matches("lazy val x: Int = 1") - matches("implicit val x = 1") - assertThrows[MatchError] { matches("var x = 1") } - } - - property("exhaustive var matcher") = test { - def matches(line: String) { val q"$mods var $name: $tpt = $rhs" = parse(line) } - matches("var x: Int") - matches("var x: Int = 1") - matches("var x = 1") - assertThrows[MatchError] { matches("val x = 1") } - } -} - -trait PackageDeconstruction { self: QuasiquoteProperties => - property("exhaustive package matcher") = test { - def matches(line: String) { val q"package $name { ..$body }" = parse(line) } - matches("package foo { }") - matches("package foo { class C }") - matches("package foo.bar { }") - matches("package bippy.bongo { object A; object B }") - matches("package bippy { package bongo { object O } }") - } - - property("exhaustive package object matcher") = test { - def matches(line: String) { - val q"package object $name extends { ..$early } with ..$parents { $self => ..$body }" = parse(line) - } - matches("package object foo") - matches("package object foo { def baz }") - matches("package object foo { self => }") - matches("package object foo extends mammy with daddy { def baz }") - matches("package object foo extends { val early = 1 } with daddy") - assertThrows[MatchError] { matches("object foo") } - } -} - -trait DefDeconstruction { self: QuasiquoteProperties => - property("exhaustive def matcher") = test { - def matches(line: String) = { - val t = parse(line) - val q"$mods0 def $name0[..$targs0](...$argss0): $restpe0 = $body0" = t - val q"$mods1 def $name1[..$targs1](...$argss1)(implicit ..$impl1): $restpe1 = $body1" = t - } - matches("def foo = foo") - matches("implicit def foo: Int = 2") - matches("def foo[T](x: T): T = x") - matches("def foo[A: B] = implicitly[B[A]]") - matches("private def foo = 0") - matches("def foo[A <% B] = null") - matches("def foo(one: One)(two: Two) = (one, two)") - matches("def foo[T](args: T*) = args.toList") - } - - property("extract implicit arg list (1)") = test { - val q"def foo(...$argss)(implicit ..$impl)" = q"def foo(x: Int)(implicit y: Int)" - assert(impl ≈ List(q"${Modifiers(IMPLICIT | PARAM)} val y: Int")) - } - - property("extract implicit arg list (2)") = test { - val q"def foo(...$argss)(implicit ..$impl)" = q"def foo(x: Int)" - assert(impl.isEmpty) - } - - property("SI-8451") = test { - val q"def this(..$params) = this(..$args)" = q"def this(x: Int) = this(0)" - assert(params ≈ List(q"${Modifiers(PARAM)} val x: Int")) - assert(args ≈ List(q"0")) - } -} - -trait ImportDeconstruction { self: QuasiquoteProperties => - property("exhaustive import matcher") = test { - def matches(line: String) = { - val q"import $ref.{..$sels}" = parse(line) - } - matches("import foo.bar") - matches("import foo.{bar, baz}") - matches("import foo.{a => b, c => d}") - matches("import foo.{poision => _, _}") - matches("import foo.bar.baz._") - } - - property("extract import binding") = test { - val q"import $_.$sel" = q"import foo.bar" - val pq"bar" = sel - } - - property("extract import wildcard") = test { - val q"import $_.$sel" = q"import foo._" - val pq"_" = sel - } - - property("extract import rename") = test { - val q"import $_.$sel" = q"import foo.{bar => baz}" - val pq"bar -> baz" = sel - val pq"$left -> $right" = sel - val pq"bar" = left - val pq"baz" = right - } - - property("extract import unimport") = test { - val q"import $_.$sel" = q"import foo.{bar => _}" - val pq"bar -> _" = sel - val pq"$left -> $right" = sel - val pq"bar" = left - val pq"_" = right - } - - property("unquote names into import selector") = forAll { - (expr: Tree, plain: TermName, oldname: TermName, newname: TermName, discard: TermName) => - - val Import(expr1, List( - ImportSelector(plain11, _, plain12, _), - ImportSelector(oldname1, _, newname1, _), - ImportSelector(discard1, _, wildcard, _))) = - q"import $expr.{$plain, $oldname => $newname, $discard => _}" - - expr1 ≈ expr && plain11 == plain12 && plain12 == plain && - oldname1 == oldname && newname1 == newname && discard1 == discard && wildcard == termNames.WILDCARD - } -} diff --git a/test/files/scalacheck/quasiquotes/DeprecationProps.scala b/test/files/scalacheck/quasiquotes/DeprecationProps.scala deleted file mode 100644 index 8e1601cf9d..0000000000 --- a/test/files/scalacheck/quasiquotes/DeprecationProps.scala +++ /dev/null @@ -1,52 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._ - -object DeprecationProps extends QuasiquoteProperties("deprecation") { - val tname = TypeName("Foo") - val tpt = tq"Foo" - val tpe = typeOf[Int] - val sym = tpe.typeSymbol.asType - val argss = List(q"x") :: List(q"y") :: Nil - val args = q"x" :: q"y" :: Nil - - property("new tpt argss") = test { - assert(q"new $tpt(...$argss)" ≈ New(tpt, argss)) - } - - property("new tpe args") = test { - assert(q"new $tpe(..$args)" ≈ New(tpe, args: _*)) - } - - property("new tpe args") = test { - assert(q"new ${sym.toType}(..$args)" ≈ New(sym, args: _*)) - } - - property("apply sym args") = test { - assert(q"$sym(..$args)" ≈ Apply(sym, args: _*)) - } - - property("applyconstructor") = test { - assert(q"new $tpt(..$args)" ≈ ApplyConstructor(tpt, args)) - } - - property("super sym name") = test { - assert(q"$sym.super[$tname].x".qualifier ≈ Super(sym, tname)) - } - - property("throw tpe args") = test { - assert(q"throw new $tpe(..$args)" ≈ Throw(tpe, args: _*)) - } - - property("casedef pat body") = test { - val pat = pq"foo" - val body = q"bar" - assert(cq"$pat => $body" ≈ CaseDef(pat, body)) - } - - property("try body cases") = test { - val cases = (pq"a", q"b") :: (pq"c", q"d") :: Nil - val newcases = cases.map { case (pat, body) => cq"$pat => $body" } - val body = q"foo" - assert(q"try $body catch { case ..$newcases }" ≈ Try(body, cases: _*)) - } -}
\ No newline at end of file diff --git a/test/files/scalacheck/quasiquotes/ErrorProps.scala b/test/files/scalacheck/quasiquotes/ErrorProps.scala deleted file mode 100644 index 0c24149372..0000000000 --- a/test/files/scalacheck/quasiquotes/ErrorProps.scala +++ /dev/null @@ -1,213 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ - -object ErrorProps extends QuasiquoteProperties("errors") { - property("can't extract two .. rankinalities in a row") = fails( - "Can't extract with .. here", - """ - val xs = List(q"x1", q"x2") - val q"f(..$xs1, ..$xs2)" = xs - """) - - property("can't unquote with given rank") = fails( - "Can't unquote List[StringBuilder], consider using .. or providing an implicit instance of Liftable[List[StringBuilder]]", - """ - import java.lang.StringBuilder - val xs: List[StringBuilder] = Nil - q"$xs" - """) - - property("unquote typename into typedef with default bounds") = fails( - "reflect.runtime.universe.Name expected but reflect.runtime.universe.TypeDef found", - """ - val T1 = TypeName("T1") - val T2 = q"type T" - val t = EmptyTree - q"type $T1[$T2 >: _root_.scala.Any <: _root_.scala.Nothing] = $t" ≈ - TypeDef(Modifiers(), T1, List(T2), t) - """) - - property("can't unquote annotations with ... rank") = fails( - "Can't unquote with ... here", - """ - val annots = List(List(q"Foo")) - q"@...$annots def foo" - """) - - property("only literal string arguments") = fails( - "Quasiquotes can only be used with literal strings", - """ - val s: String = "foo" - StringContext(s).q() - """) - - property("don't know how to unquote inside of strings") = fails( - "Don't know how to unquote here", - """ - val x: Tree = EmptyTree - StringContext("\"", "\"").q(x) - """) - - property("non-liftable type ..") = fails( - "Can't unquote List[StringBuilder] with .., consider omitting the dots or providing an implicit instance of Liftable[StringBuilder]", - """ - import java.lang.StringBuilder - val bazs = List(new StringBuilder) - q"f(..$bazs)" - """) - - property("non-liftable type ...") = fails( - "Can't unquote List[List[StringBuilder]] with .., consider using ... or providing an implicit instance of Liftable[StringBuilder]", - """ - import java.lang.StringBuilder - val bazs = List(List(new StringBuilder)) - q"f(..$bazs)" - """) - - property("use .. rank or provide liftable") = fails( - "Can't unquote List[StringBuilder], consider using .. or providing an implicit instance of Liftable[List[StringBuilder]]", - """ - import java.lang.StringBuilder - val lst: List[StringBuilder] = Nil - q"f($lst)" - """) - - property("use ... rank or provide liftable") = fails( - "Can't unquote List[List[StringBuilder]], consider using ... or providing an implicit instance of Liftable[List[List[StringBuilder]]]", - """ - import java.lang.StringBuilder - val xs: List[List[StringBuilder]] = Nil - q"$xs" - """) - - property("not liftable or natively supported") = fails( - "Can't unquote StringBuilder, consider providing an implicit instance of Liftable[StringBuilder]", - """ - import java.lang.StringBuilder - val sb = new StringBuilder - q"f($sb)" - """) - - property("can't unquote with ... rank here") = fails( - "Can't unquote with ... here", - """ - val lst: List[List[Tree]] = Nil; val t = EmptyTree - q"f(...$lst, $t)" - """) - - property("name expected") = fails( - "reflect.runtime.universe.Name expected but reflect.runtime.universe.Tree found", - """ - val t = EmptyTree - q"class $t" - """) - - property("flags or mods expected") = fails( - "reflect.runtime.universe.FlagSet or reflect.runtime.universe.Modifiers expected but reflect.runtime.universe.Tree found", - """ - val t = EmptyTree - q"$t def foo" - """) - - property("cant unquote flags together with mods") = fails( - "Can't unquote flags together with modifiers, consider merging flags into modifiers", - """ - val f = Flag.IMPLICIT; val m = NoMods - q"$f $m def foo" - """) - - property("can't unquote mods with annots") = fails( - "Can't unquote modifiers together with annotations, consider merging annotations into modifiers", - """ - val m = NoMods - q"@annot $m def foo" - """) - - property("can't unquote modifiers with inline flags") = fails( - "Can't unquote modifiers together with flags, consider merging flags into modifiers", - """ - val m = NoMods - q"$m implicit def foo" - """) - - property("can't unquote multiple mods") = fails( - "Can't unquote multiple modifiers, consider merging them into a single modifiers instance", - """ - val m1 = NoMods; val m2 = NoMods - q"$m1 $m2 def foo" - """) - - property("can't extract mods with annots") = fails( - "Can't extract modifiers together with annotations, consider extracting just modifiers", - """ - val q"@$annot $mods def foo" = EmptyTree - """) - - property("can't extract multiple mods") = fails( - "Can't extract multiple modifiers together, consider extracting a single modifiers instance", - """ - val q"$m1 $m2 def foo" = EmptyTree - """) - - property("can't unquote values of Null") = fails( - "Can't unquote Null, bottom type values often indicate programmer mistake", - """ - val n = null - q"$n" - """) - - property("can't unquote values of Nothing") = fails( - "Can't unquote Nothing, bottom type values often indicate programmer mistake", - """ - def n = ??? - q"$n" - """) - - property("SI-8211: check unbound placeholder parameters") = fails( - "unbound placeholder parameter", - """ - q"_" - """) - - property("SI-8211: check unbound wildcard types") = fails( - "unbound wildcard type", - """ - tq"_" - """) - - property("SI-8420: don't crash on splicing of non-unliftable native type (1)") = fails( - "Can't unquote List[reflect.runtime.universe.Symbol] with .., consider omitting the dots or providing an implicit instance of Liftable[reflect.runtime.universe.Symbol]", - """ - val l: List[Symbol] = Nil - q"f(..$l)" - """) - - property("SI-8420: don't crash on splicing of non-unliftable native type (2)") = fails( - "Can't unquote List[reflect.runtime.universe.FlagSet] with .., consider omitting the dots or providing an implicit instance of Liftable[reflect.runtime.universe.FlagSet]", - """ - val l: List[FlagSet] = Nil - q"f(..$l)" - """) - - property("SI-8420: don't crash on splicing of non-unliftable native type (3)") = fails( - "Can't unquote List[reflect.runtime.universe.Modifiers] with .., consider omitting the dots or providing an implicit instance of Liftable[reflect.runtime.universe.Modifiers]", - """ - val l: List[Modifiers] = Nil - q"f(..$l)" - """) - - property("SI-8451 construction: disallow everything except for constructor calls in secondary constructor bodies") = fails( - "'this' expected but unquotee found", - """ - val rhs1 = q"this(0)" - val ctor1 = q"def this(x: Int) = $rhs1" - """) - - property("SI-8451 deconstruction: disallow everything except for constructor calls in secondary constructor bodies") = fails( - "'this' expected but unquotee found", - """ - val q"def this(..$params) = $rhs2" = q"def this(x: Int) = this(0)" - """) - - // // Make sure a nice error is reported in this case - // { import Flag._; val mods = NoMods; q"lazy $mods val x: Int" } -} diff --git a/test/files/scalacheck/quasiquotes/ForProps.scala b/test/files/scalacheck/quasiquotes/ForProps.scala deleted file mode 100644 index b14d345edd..0000000000 --- a/test/files/scalacheck/quasiquotes/ForProps.scala +++ /dev/null @@ -1,70 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._, internal.reificationSupport._ - -object ForProps extends QuasiquoteProperties("for") { - case class ForEnums(val value: List[Tree]) - - def genSimpleBind: Gen[Bind] = - for(name <- genTermName) - yield pq"$name @ _" - - def genForFilter: Gen[Tree] = - for(cond <- genIdent(genTermName)) - yield fq"if $cond" - - def genForFrom: Gen[Tree] = - for(lhs <- genSimpleBind; rhs <- genIdent(genTermName)) - yield fq"$lhs <- $rhs" - - def genForEq: Gen[Tree] = - for(lhs <- genSimpleBind; rhs <- genIdent(genTermName)) - yield fq"$lhs = $rhs" - - def genForEnums(size: Int): Gen[ForEnums] = - for(first <- genForFrom; rest <- listOfN(size, oneOf(genForFrom, genForFilter, genForEq))) - yield new ForEnums(first :: rest) - - implicit val arbForEnums: Arbitrary[ForEnums] = arbitrarySized(genForEnums) - - property("construct-reconstruct for") = forAll { (enums: ForEnums, body: Tree) => - val SyntacticFor(recoveredEnums, recoveredBody) = SyntacticFor(enums.value, body) - recoveredEnums ≈ enums.value && recoveredBody ≈ body - } - - property("construct-reconstruct for-yield") = forAll { (enums: ForEnums, body: Tree) => - val SyntacticForYield(recoveredEnums, recoveredBody) = SyntacticForYield(enums.value, body) - recoveredEnums ≈ enums.value && recoveredBody ≈ body - } - - val abcde = List(fq"a <-b", fq"if c", fq"d = e") - val foobarbaz = pq"foo @ Bar(baz)" - val fv = q"f(v)" - - property("construct/deconstruct for loop with fq") = test { - val for0 = q"for(..$abcde) $fv" - assertEqAst(for0, "for(a <- b; if c; d = e) f(v)") - val q"for(..$enums) $body" = for0 - assert(enums ≈ abcde) - assert(body ≈ fv) - } - - property("construct/deconstruct valfrom with fq") = test { - assert(fq"$foobarbaz <- $fv" ≈ fq"foo @ Bar(baz) <- f(v)") - val fq"$lhs <- $rhs" = fq"$foobarbaz <- $fv" - assert(lhs ≈ foobarbaz) - assert(rhs ≈ fv) - } - - property("construct/deconstruct valeq with fq") = test { - assert(fq"$foobarbaz = $fv" ≈ fq"foo @ Bar(baz) = f(v)") - val fq"$lhs = $rhs" = fq"$foobarbaz = $fv" - assert(lhs ≈ foobarbaz) - assert(rhs ≈ fv) - } - - property("construct/deconstruct filter with fq") = test { - assert(fq"if $fv" ≈ fq"if f(v)") - val fq"if $cond" = fq"if $fv" - assert(cond ≈ fv) - } -}
\ No newline at end of file diff --git a/test/files/scalacheck/quasiquotes/LiftableProps.scala b/test/files/scalacheck/quasiquotes/LiftableProps.scala deleted file mode 100644 index a4c57ac359..0000000000 --- a/test/files/scalacheck/quasiquotes/LiftableProps.scala +++ /dev/null @@ -1,174 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._ - -object LiftableProps extends QuasiquoteProperties("liftable") { - property("unquote byte") = test { - val c: Byte = 0 - assert(q"$c" ≈ Literal(Constant(c))) - assert(q"${0: Byte}" ≈ Literal(Constant(c))) - } - - property("unquote short") = test { - val c: Short = 0 - assert(q"$c" ≈ Literal(Constant(c))) - assert(q"${0: Short}" ≈ Literal(Constant(c))) - } - - property("unquote char") = test { - val c: Char = 'c' - assert(q"$c" ≈ Literal(Constant(c))) - assert(q"${'c'}" ≈ Literal(Constant(c))) - } - - property("unquote int") = test { - val c: Int = 0 - assert(q"$c" ≈ Literal(Constant(c))) - assert(q"${0: Int}" ≈ Literal(Constant(c))) - } - - property("unquote long") = test { - val c: Long = 0 - assert(q"$c" ≈ Literal(Constant(c))) - assert(q"${0: Long}" ≈ Literal(Constant(c))) - } - - property("unquote float") = test { - val c: Float = 0.0f - assert(q"$c" ≈ Literal(Constant(c))) - assert(q"${0.0f: Float}" ≈ Literal(Constant(c))) - } - - property("unquote double") = test { - val c: Double = 0.0 - assert(q"$c" ≈ Literal(Constant(c))) - assert(q"${0.0: Double}" ≈ Literal(Constant(c))) - } - - property("unquote boolean") = test { - val c: Boolean = false - assert(q"$c" ≈ Literal(Constant(c))) - assert(q"${true}" ≈ Literal(Constant(true))) - assert(q"${false}" ≈ Literal(Constant(false))) - } - - property("unquote string") = test { - val c: String = "s" - assert(q"$c" ≈ Literal(Constant(c))) - assert(q"${"s"}" ≈ Literal(Constant(c))) - } - - property("unquote unit") = test { - val c: Unit = () - assert(q"$c" ≈ Literal(Constant(c))) - assert(q"${()}" ≈ Literal(Constant(c))) - } - - property("lift symbol") = test { - val s = rootMirror.staticClass("scala.Int") - assert(q"$s" ≈ Ident(s)) - } - - property("lift type") = test { - val tpe = rootMirror.staticClass("scala.Int").toType - assert(q"$tpe" ≈ TypeTree(tpe)) - } - - property("lift type tag") = test { - val tag = TypeTag.Int - assert(q"$tag" ≈ TypeTree(tag.tpe)) - } - - property("lift weak type tag") = test { - val tag = WeakTypeTag.Int - assert(q"$tag" ≈ TypeTree(tag.tpe)) - } - - property("lift constant") = test { - val const = Constant(0) - assert(q"$const" ≈ q"0") - } - - val immutable = q"$scalapkg.collection.immutable" - - property("lift list variants") = test { - val lst = List(1, 2) - assert(q"$lst" ≈ q"$immutable.List(1, 2)") - assert(q"f(..$lst)" ≈ q"f(1, 2)") - val llst = List(List(1), List(2)) - assert(q"f(..$llst)" ≈ q"f($immutable.List(1), $immutable.List(2))") - assert(q"f(...$llst)" ≈ q"f(1)(2)") - } - - property("lift list of tree") = test { - val lst = List(q"a", q"b") - assert(q"$lst" ≈ q"$immutable.List(a, b)") - } - - property("lift tuple") = test { - assert(q"${(1, 2)}" ≈ q"(1, 2)") - assert(q"${(1, 2, 3)}" ≈ q"(1, 2, 3)") - assert(q"${(1, 2, 3, 4)}" ≈ q"(1, 2, 3, 4)") - assert(q"${(1, 2, 3, 4, 5)}" ≈ q"(1, 2, 3, 4, 5)") - assert(q"${(1, 2, 3, 4, 5, 6)}" ≈ q"(1, 2, 3, 4, 5, 6)") - assert(q"${(1, 2, 3, 4, 5, 6, 7)}" ≈ q"(1, 2, 3, 4, 5, 6, 7)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)") - assert(q"${(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22)}" ≈ q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22)") - } - - property("lift nil") = test { - val nil = Nil - assert(q"$nil" ≈ q"scala.collection.immutable.Nil") - } - - property("lift some") = test { - val some1 = Some(1) - assert(q"$some1" ≈ q"scala.Some(1)") - val some2: Option[Int] = Some(1) - assert(q"$some2" ≈ q"scala.Some(1)") - } - - property("lift none") = test { - val none1 = None - assert(q"$none1" ≈ q"scala.None") - val none2: Option[Int] = None - assert(q"$none2" ≈ q"scala.None") - } - - property("lift left") = test { - val left1 = Left(1) - assert(q"$left1" ≈ q"scala.util.Left(1)") - val left2: Left[Int, Int] = Left(1) - assert(q"$left2" ≈ q"scala.util.Left(1)") - val left3: Either[Int, Int] = Left(1) - assert(q"$left3" ≈ q"scala.util.Left(1)") - } - - property("lift right") = test { - val right1 = Right(1) - assert(q"$right1" ≈ q"scala.util.Right(1)") - val right2: Right[Int, Int] = Right(1) - assert(q"$right2" ≈ q"scala.util.Right(1)") - val right3: Either[Int, Int] = Right(1) - assert(q"$right3" ≈ q"scala.util.Right(1)") - } - - property("lift xml comment") = test { - implicit val liftXmlComment = Liftable[xml.Comment] { comment => - q"new _root_.scala.xml.Comment(${comment.commentText})" - } - assert(q"${xml.Comment("foo")}" ≈ q"<!--foo-->") - } -} diff --git a/test/files/scalacheck/quasiquotes/PatternConstructionProps.scala b/test/files/scalacheck/quasiquotes/PatternConstructionProps.scala deleted file mode 100644 index 7ed95fa984..0000000000 --- a/test/files/scalacheck/quasiquotes/PatternConstructionProps.scala +++ /dev/null @@ -1,36 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._ - -object PatternConstructionProps extends QuasiquoteProperties("pattern construction") { - property("unquote bind") = forAll { (bind: Bind) => - pq"$bind" ≈ bind - } - - property("unquote name into bind") = forAll { (name: TermName) => - pq"$name" ≈ Bind(name, Ident(termNames.WILDCARD)) - } - - property("unquote name and tree into bind") = forAll { (name: TermName, tree: Tree) => - pq"$name @ $tree" ≈ Bind(name, tree) - } - - property("unquote type name into typed") = forAll { (name: TypeName) => - pq"_ : $name" ≈ Typed(Ident(termNames.WILDCARD), Ident(name)) - } - - property("unquote tree into typed") = forAll { (typ: Tree) => - pq"_ : $typ" ≈ Typed(Ident(termNames.WILDCARD), typ) - } - - property("unquote into apply") = forAll { (pat: Tree, subpat: Tree) => - pq"$pat($subpat)" ≈ Apply(pat, List(subpat)) - } - - property("unquote into casedef") = forAll { (pat: Tree, cond: Tree, body: Tree) => - cq"$pat if $cond => $body" ≈ CaseDef(pat, cond, body) - } - - property("unquote into alternative") = forAll { (first: Tree, rest: List[Tree]) => - pq"$first | ..$rest" ≈ Alternative(first :: rest) - } -} diff --git a/test/files/scalacheck/quasiquotes/PatternDeconstructionProps.scala b/test/files/scalacheck/quasiquotes/PatternDeconstructionProps.scala deleted file mode 100644 index ad3266bcec..0000000000 --- a/test/files/scalacheck/quasiquotes/PatternDeconstructionProps.scala +++ /dev/null @@ -1,44 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._ - -object PatternDeconstructionProps extends QuasiquoteProperties("pattern deconstruction") { - property("extract bind") = forAll { (bind: Bind) => - val pq"$bind0" = pq"$bind" - bind0 ≈ bind - } - - property("extract bind and subpattern") = forAll { (name: TermName, subp: Tree) => - val pq"$name0 @ $subp0" = pq"$name @ $subp" - name0 ≈ name && subp0 ≈ subp - } - - property("extract typed") = forAll { (typ: Tree) => - val pq"_ : $typ0" = pq"_ : $typ" - typ0 ≈ typ - } - - property("extract apply") = forAll { (pat: Tree, subpat: Tree) => - val pq"$pat0($subpat0)" = pq"$pat($subpat)" - pat0 ≈ pat && subpat0 ≈ subpat - } - - property("extract apply many") = forAll { (pat: Tree, subpats: List[Tree]) => - val pq"$pat0(..$subpats0)" = pq"$pat(..$subpats)" - pat0 ≈ pat && subpats0 ≈ subpats - } - - property("extract apply last") = forAll { (pat: Tree, subpats: List[Tree], subpatlast: Tree) => - val pq"$pat0(..$subpats0, $subpatlast0)" = pq"$pat(..$subpats, $subpatlast)" - pat0 ≈ pat && subpats0 ≈ subpats && subpatlast0 ≈ subpatlast - } - - property("extract casedef") = forAll { (pat: Tree, cond: Tree, body: Tree) => - val cq"$pat0 if $cond0 => $body0" = cq"$pat if $cond => $body" - pat0 ≈ pat && cond0 ≈ cond && body0 ≈ body - } - - property("extract alternative") = forAll { (first: Tree, rest: List[Tree]) => - val pq"$first1 | ..$rest1" = pq"$first | ..$rest" - first1 ≈ first && rest1 ≈ rest - } -} diff --git a/test/files/scalacheck/quasiquotes/QuasiquoteProperties.scala b/test/files/scalacheck/quasiquotes/QuasiquoteProperties.scala deleted file mode 100644 index 6132244227..0000000000 --- a/test/files/scalacheck/quasiquotes/QuasiquoteProperties.scala +++ /dev/null @@ -1,120 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.tools.reflect.{ToolBox, ToolBoxError} -import scala.reflect.runtime.currentMirror -import scala.reflect.runtime.universe._, Flag._, internal.reificationSupport.setSymbol - -class QuasiquoteProperties(name: String) extends Properties(name) with ArbitraryTreesAndNames with Helpers - -trait Helpers { - /** Runs a code block and returns proof confirmation - * if no exception has been thrown while executing code - * block. This is useful for simple one-off tests. - */ - def test[T](block: => T) = - Prop { params => - block - Result(Prop.Proof) - } - - object simplify extends Transformer { - object SimplifiedName { - val st = scala.reflect.runtime.universe.asInstanceOf[scala.reflect.internal.SymbolTable] - val FreshName = new st.FreshNameExtractor - def unapply[T <: Name](name: T): Option[T] = name.asInstanceOf[st.Name] match { - case FreshName(prefix) => - Some((if (name.isTermName) TermName(prefix) else TypeName(prefix)).asInstanceOf[T]) - } - } - - override def transform(tree: Tree): Tree = tree match { - case Ident(SimplifiedName(name)) => Ident(name) - case ValDef(mods, SimplifiedName(name), tpt, rhs) => ValDef(mods, name, transform(tpt), transform(rhs)) - case Bind(SimplifiedName(name), rhs) => Bind(name, rhs) - case _ => - super.transform(tree) - } - - def apply(tree: Tree): Tree = transform(tree) - } - - implicit class TestSimilarTree(tree1: Tree) { - def ≈(tree2: Tree) = simplify(tree1).equalsStructure(simplify(tree2)) - } - - implicit class TestSimilarListTree(lst: List[Tree]) { - def ≈(other: List[Tree]) = (lst.length == other.length) && lst.zip(other).forall { case (t1, t2) => t1 ≈ t2 } - } - - implicit class TestSimilarListListTree(lst: List[List[Tree]]) { - def ≈(other: List[List[Tree]]) = (lst.length == other.length) && lst.zip(other).forall { case (l1, l2) => l1 ≈ l2 } - } - - implicit class TestSimilarName(name: Name) { - def ≈(other: Name) = name == other - } - - implicit class TestSimilarMods(mods: Modifiers) { - def ≈(other: Modifiers) = (mods.flags == other.flags) && (mods.privateWithin ≈ other.privateWithin) && (mods.annotations ≈ other.annotations) - } - - def assertThrows[T <: AnyRef](f: => Any)(implicit manifest: Manifest[T]): Unit = { - val clazz = manifest.runtimeClass.asInstanceOf[Class[T]] - val thrown = - try { - f - false - } catch { - case u: Throwable => - if (!clazz.isAssignableFrom(u.getClass)) - assert(false, s"wrong exception: $u") - true - } - if(!thrown) - assert(false, "exception wasn't thrown") - } - - def assertEqAst(tree: Tree, code: String) = assert(eqAst(tree, code)) - def eqAst(tree: Tree, code: String) = tree ≈ parse(code) - - val toolbox = currentMirror.mkToolBox() - val parse = toolbox.parse(_) - val compile = toolbox.compile(_) - val eval = toolbox.eval(_) - - def typecheck(tree: Tree) = toolbox.typecheck(tree) - - def typecheckTyp(tree: Tree) = { - val q"type $_ = $res" = typecheck(q"type T = $tree") - res - } - - def typecheckPat(tree: Tree) = { - val q"$_ match { case $res => }" = typecheck(q"((): Any) match { case $tree => }") - res - } - - def fails(msg: String, block: String) = { - def result(ok: Boolean, description: String = "") = { - val status = if (ok) Prop.Proof else Prop.False - val labels = if (description != "") Set(description) else Set.empty[String] - Prop { new Prop.Result(status, Nil, Set.empty, labels) } - } - try { - compile(parse(s""" - object Wrapper extends Helpers { - import scala.reflect.runtime.universe._ - $block - } - """)) - result(false, "given code doesn't fail to typecheck") - } catch { - case ToolBoxError(emsg, _) => - if (!emsg.contains(msg)) - result(false, s"error message '${emsg}' is not the same as expected '$msg'") - else - result(true) - } - } - - val scalapkg = setSymbol(Ident(TermName("scala")), definitions.ScalaPackage) -} diff --git a/test/files/scalacheck/quasiquotes/RuntimeErrorProps.scala b/test/files/scalacheck/quasiquotes/RuntimeErrorProps.scala deleted file mode 100644 index 40fb42d63c..0000000000 --- a/test/files/scalacheck/quasiquotes/RuntimeErrorProps.scala +++ /dev/null @@ -1,75 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._ - -object RuntimeErrorProps extends QuasiquoteProperties("errors") { - def testFails[T](block: =>T) = test { - assertThrows[IllegalArgumentException] { - block - } - } - - property("default param anon function") = testFails { - val param = q"val x: Int = 1" - q"{ $param => x + 1 }" - } - - property("non-casedef case") = testFails { - val x = q"x" - q"foo match { case $x }" - } - - property("non-new annotation") = testFails { - val annot = q"foo" - q"@$annot def foo" - } - - property("non-valdef param") = testFails { - val param = q"foo" - q"def foo($param)" - } - - property("non-valdef class param") = testFails { - val param = q"foo" - q"class Foo($param)" - } - - property("non-typedef type param") = testFails { - val tparam = tq"T" - q"class C[$tparam]" - } - - property("non-definition refine stat") = testFails { - val stat = q"foo" - tq"Foo { $stat }" - } - - property("non-definition early def") = testFails { - val stat = q"foo" - q"class Foo extends { $stat } with Bar" - } - - property("type apply for definition") = testFails { - val defn = q"def foo" - q"$defn[foo]" - } - - property("non-val selftype") = testFails { - val foo = q"foo" - q"class Foo { $foo => }" - } - - property("for empty enums") = testFails { - val enums = List.empty[Tree] - q"for(..$enums) 0" - } - - property("for starts with non-from enum") = testFails { - val enums = fq"foo = bar" :: Nil - q"for(..$enums) 0" - } - - property("for invalid enum") = testFails { - val enums = q"foo" :: Nil - q"for(..$enums) 0" - } -} diff --git a/test/files/scalacheck/quasiquotes/TermConstructionProps.scala b/test/files/scalacheck/quasiquotes/TermConstructionProps.scala deleted file mode 100644 index 409f07037e..0000000000 --- a/test/files/scalacheck/quasiquotes/TermConstructionProps.scala +++ /dev/null @@ -1,325 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._ - -object TermConstructionProps extends QuasiquoteProperties("term construction") { - property("unquote single tree return tree itself") = forAll { (t: Tree) => - q"$t" ≈ t - } - - property("unquote trees into if expression") = forAll { (t1: Tree, t2: Tree, t3: Tree) => - q"if($t1) $t2 else $t3" ≈ If(t1, t2, t3) - } - - property("unquote trees into ascriptiopn") = forAll { (t1: Tree, t2: Tree) => - q"$t1 : $t2" ≈ Typed(t1, t2) - } - - property("unquote trees into apply") = forAll { (t1: Tree, t2: Tree, t3: Tree) => - q"$t1($t2, $t3)" ≈ Apply(t1, List(t2, t3)) - } - - property("unquote trees with .. rank into apply") = forAll { (ts: List[Tree]) => - q"f(..$ts)" ≈ Apply(q"f", ts) - } - - property("unquote iterable into apply") = forAll { (trees: List[Tree]) => - val itrees: Iterable[Tree] = trees - q"f(..$itrees)" ≈ Apply(q"f", trees) - } - - property("unquote trees with ... rank into apply") = forAll { (ts1: List[Tree], ts2: List[Tree]) => - val argss = List(ts1, ts2) - q"f(...$argss)" ≈ Apply(Apply(q"f", ts1), ts2) - } - - property("unquote term name into assign") = forAll { (name: TermName, t: Tree) => - q"$name = $t" ≈ Assign(Ident(name), t) - } - - property("unquote trees into block") = forAll { (t1: Tree, t2: Tree, t3: Tree) => - blockInvariant(q"""{ - $t1 - $t2 - $t3 - }""", List(t1, t2, t3)) - } - - - property("unquote tree into new") = forAll { (tree: Tree) => - q"new $tree" ≈ Apply(Select(New(tree), termNames.CONSTRUCTOR), List()) - } - - property("unquote tree into return") = forAll { (tree: Tree) => - q"return $tree" ≈ Return(tree) - } - - property("unquote a list of arguments") = forAll { (fun: Tree, args: List[Tree]) => - q"$fun(..$args)" ≈ Apply(fun, args) - } - - property("unquote list and non-list fun arguments") = forAll { (fun: Tree, arg1: Tree, arg2: Tree, args: List[Tree]) => - q"$fun(..$args, $arg1, $arg2)" ≈ Apply(fun, args ++ List(arg1) ++ List(arg2)) && - q"$fun($arg1, ..$args, $arg2)" ≈ Apply(fun, List(arg1) ++ args ++ List(arg2)) && - q"$fun($arg1, $arg2, ..$args)" ≈ Apply(fun, List(arg1) ++ List(arg2) ++ args) - } - - property("unquote into new") = forAll { (name: TypeName, body: List[Tree]) => - q"new $name { ..$body }" ≈ - q"""{ - final class $$anon extends $name { - ..$body - } - new $$anon - }""" - } - - property("unquote type name into this") = forAll { (T: TypeName) => - q"$T.this" ≈ This(T) - } - - property("unquote tree into throw") = forAll { (t: Tree) => - q"throw $t" ≈ Throw(t) - } - - property("unquote trees into type apply") = forAll { (fun: TreeIsTerm, types: List[Tree]) => - q"$fun[..$types]" ≈ (if (types.nonEmpty) TypeApply(fun, types) else fun) - } - - property("unquote trees into while loop") = forAll { (cond: Tree, body: Tree) => - val LabelDef(_, List(), If(cond1, Block(List(body1), Apply(_, List())), Literal(Constant(())))) = q"while($cond) $body" - body1 ≈ body && cond1 ≈ cond - } - - property("unquote trees into do while loop") = forAll { (cond: Tree, body: Tree) => - val LabelDef(_, List(), Block(List(body1), If(cond1, Apply(_, List()), Literal(Constant(()))))) = q"do $body while($cond)" - body1 ≈ body && cond1 ≈ cond - } - - def blockInvariant(quote: Tree, trees: List[Tree]) = - quote ≈ (trees match { - case Nil => q"{}" - case _ :+ last if !last.isTerm => Block(trees, q"()") - case head :: Nil => head - case init :+ last => Block(init, last) - }) - - property("unquote list of trees into block (1)") = forAll { (trees: List[Tree]) => - blockInvariant(q"{ ..$trees }", trees) - } - - property("unquote list of trees into block (2)") = forAll { (trees1: List[Tree], trees2: List[Tree]) => - blockInvariant(q"{ ..$trees1 ; ..$trees2 }", trees1 ++ trees2) - } - - property("unquote list of trees into block (3)") = forAll { (trees: List[Tree], tree: Tree) => - blockInvariant(q"{ ..$trees; $tree }", trees :+ tree) - } - - property("unquote term into brackets") = test { - val a = q"a" - assert(q"($a)" ≈ a) - } - - property("unquote terms into tuple") = test { - val a1 = q"a1" - val a2 = q"a2" - val as = List(a1, a2) - assert(q"(..$as)" ≈ q"scala.Tuple2($a1, $a2)") - assert(q"(a0, ..$as)" ≈ q"scala.Tuple3(a0, $a1, $a2)") - } - - property("unquote empty list into tuple") = test { - val empty = List[Tree]() - assert(q"(..$empty)" ≈ q"()") - } - - property("unquote single element list into tuple") = test { - val xs = q"x" :: Nil - assert(q"(..$xs)" ≈ xs.head) - } - - property("function param flags are the same") = test { - val xy = q"val x: A" :: q"val y: B" :: Nil - assertEqAst(q"(..$xy) => x + y", "(x: A, y: B) => x + y") - } - - property("anonymous functions don't support default values") = test { - val x = q"val x: Int = 1" - assertThrows[IllegalArgumentException] { q"($x) => x" } - } - - property("assign variable") = test { - val v = q"v" - val value = q"foo" - assertEqAst(q"$v = $value", "v = foo") - } - - property("assign update 1") = test { - val v = q"v" - val args = q"1" :: q"2" :: Nil - val value = q"foo" - assertEqAst(q"$v(..$args) = $value", "v(1, 2) = foo") - } - - property("assign update 2") = test { - val a = q"v(0)" - val value = q"foo" - assertEqAst(q"$a = $value", "v(0) = foo") - } - - property("assign or named arg") = test { - val assignx = q"x = 1" - assertEqAst(q"f($assignx)", "f(x = 1)") - } - - property("fresh names are regenerated at each evaluation") = test { - def plusOne = q"{ _ + 1 }" - assert(!plusOne.equalsStructure(plusOne)) - def whileTrue = q"while(true) false" - assert(!whileTrue.equalsStructure(whileTrue)) - def withEvidence = q"def foo[T: X]" - assert(!withEvidence.equalsStructure(withEvidence)) - } - - property("make sure inference doesn't infer any") = test { - val l1 = List(q"foo") - val l2 = List(q"bar") - val baz = q"baz" - assert(q"f(..${l1 ++ l2})" ≈ q"f(foo, bar)") - assert(q"f(..${l1 ++ l2}, $baz)" ≈ q"f(foo, bar, baz)") - assert(q"f(${if (true) q"a" else q"b"})" ≈ q"f(a)") - } - - property("unquote iterable of non-parametric type") = test { - object O extends Iterable[Tree] { def iterator = List(q"foo").iterator } - q"f(..$O)" - } - - property("SI-8016") = test { - val xs = q"1" :: q"2" :: Nil - assertEqAst(q"..$xs", "{1; 2}") - assertEqAst(q"{..$xs}", "{1; 2}") - } - - property("SI-6842") = test { - val cases: List[Tree] = cq"a => b" :: cq"_ => c" :: Nil - assertEqAst(q"1 match { case ..$cases }", "1 match { case a => b case _ => c }") - assertEqAst(q"try 1 catch { case ..$cases }", "try 1 catch { case a => b case _ => c }") - } - - property("SI-8009") = test { - q"`foo`".asInstanceOf[reflect.internal.SymbolTable#Ident].isBackquoted - } - - property("SI-8148") = test { - val q"($a, $b) => $_" = q"_ + _" - assert(a.name != b.name) - } - - property("SI-7275 a") = test { - val t = q"stat1; stat2" - assertEqAst(q"..$t", "{stat1; stat2}") - } - - property("SI-7275 b") = test { - def f(t: Tree) = q"..$t" - assertEqAst(f(q"stat1; stat2"), "{stat1; stat2}") - } - - property("SI-7275 c1") = test { - object O - implicit val liftO = Liftable[O.type] { _ => q"foo; bar" } - assertEqAst(q"f(..$O)", "f(foo, bar)") - } - - property("SI-7275 c2") = test { - object O - implicit val liftO = Liftable[O.type] { _ => q"{ foo; bar }; { baz; bax }" } - assertEqAst(q"f(...$O)", "f(foo, bar)(baz, bax)") - } - - property("SI-7275 d") = test { - val l = q"a; b" :: q"c; d" :: Nil - assertEqAst(q"f(...$l)", "f(a, b)(c, d)") - val l2: Iterable[Tree] = l - assertEqAst(q"f(...$l2)", "f(a, b)(c, d)") - } - - property("SI-7275 e") = test { - val t = q"{ a; b }; { c; d }" - assertEqAst(q"f(...$t)", "f(a, b)(c, d)") - } - - property("SI-7275 e2") = test { - val t = q"{ a; b }; c; d" - assertEqAst(q"f(...$t)", "f(a, b)(c)(d)") - } - - property("remove synthetic unit") = test { - val q"{ ..$stats1 }" = q"{ def x = 2 }" - assert(stats1 ≈ List(q"def x = 2")) - val q"{ ..$stats2 }" = q"{ class X }" - assert(stats2 ≈ List(q"class X")) - val q"{ ..$stats3 }" = q"{ type X = Int }" - assert(stats3 ≈ List(q"type X = Int")) - val q"{ ..$stats4 }" = q"{ val x = 2 }" - assert(stats4 ≈ List(q"val x = 2")) - } - - property("don't remove user-defined unit") = test { - val q"{ ..$stats }" = q"{ def x = 2; () }" - assert(stats ≈ List(q"def x = 2", q"()")) - } - - property("empty-tree is not a block") = test { - assertThrows[MatchError] { - val q"{ ..$stats1 }" = q" " - } - } - - property("empty block is synthetic unit") = test { - val q"()" = q"{}" - val q"{..$stats}" = q"{}" - assert(stats.isEmpty) - assertEqAst(q"{..$stats}", "{}") - assertEqAst(q"{..$stats}", "()") - } - - property("consistent variable order") = test { - val q"$a = $b = $c = $d = $e = $f = $g = $h = $k = $l" = q"a = b = c = d = e = f = g = h = k = l" - assert(a ≈ q"a" && b ≈ q"b" && c ≈ q"c" && d ≈ q"d" && e ≈ q"e" && g ≈ q"g" && h ≈ q"h" && k ≈ q"k" && l ≈ q"l") - } - - property("SI-8385 a") = test { - assertEqAst(q"(foo.x = 1)(2)", "(foo.x = 1)(2)") - } - - property("SI-8385 b") = test { - assertEqAst(q"(() => ())()", "(() => ())()") - } - - property("match scrutinee may not be empty") = test { - assertThrows[IllegalArgumentException] { - val scrutinee = q"" - val cases = List(cq"_ =>") - q"$scrutinee match { case ..$cases }" - } - } - - property("construct partial function") = test { - val cases = List(cq"a => b", cq"c => d") - assertEqAst(q"{ case ..$cases }", "{ case a => b case c => d }") - } - - property("SI-8609 a") = test { - val q1 = q"val x = 1" - val q2 = q"..$q1; val y = 2" - assert(q2 ≈ q"{ val x = 1; val y = 2 }") - } - - property("SI-8609 b") = test { - val q1 = q"import foo.bar" - val q2 = q"..$q1; val y = 2" - assert(q2 ≈ q"{ import foo.bar; val y = 2 }") - } -} diff --git a/test/files/scalacheck/quasiquotes/TermDeconstructionProps.scala b/test/files/scalacheck/quasiquotes/TermDeconstructionProps.scala deleted file mode 100644 index 07e8f3faac..0000000000 --- a/test/files/scalacheck/quasiquotes/TermDeconstructionProps.scala +++ /dev/null @@ -1,256 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._ - -object TermDeconstructionProps extends QuasiquoteProperties("term deconstruction") { - property("f(..x) = f") = test { - // see SI-8008 - assertThrows[MatchError] { - val q"f(..$args)" = q"f" - } - } - - property("f(x)") = forAll { (x: Tree) => - val q"f($x1)" = q"f($x)" - x1 ≈ x - } - - property("f(..xs)") = forAll { (x1: Tree, x2: Tree) => - val q"f(..$xs)" = q"f($x1, $x2)" - xs ≈ List(x1, x2) - } - - property("f(y, ..ys)") = forAll { (x1: Tree, x2: Tree, x3: Tree) => - val q"f($y, ..$ys)" = q"f($x1, $x2, $x3)" - y ≈ x1 && ys ≈ List(x2, x3) - } - - property("f(y1, y2, ..ys)") = forAll { (x1: Tree, x2: Tree, x3: Tree) => - val q"f($y1, $y2, ..$ys)" = q"f($x1, $x2, $x3)" - y1 ≈ x1 && y2 ≈ x2 && ys ≈ List(x3) - } - - property("f(y1, ..ys, yn)") = forAll { (x1: Tree, x2: Tree, x3: Tree, x4: Tree) => - val q"f($y1, ..$ys, $yn)" = q"f($x1, $x2, $x3, $x4)" - y1 ≈ x1 && ys ≈ List(x2, x3) && yn ≈ x4 - } - - property("f(..ys, y_{n-1}, y_n)") = forAll { (x1: Tree, x2: Tree, x3: Tree, x4: Tree) => - val q"f(..$ys, $yn1, $yn)" = q"f($x1, $x2, $x3, $x4)" - ys ≈ List(x1, x2) && yn1 ≈ x3 && yn ≈ x4 - } - - property("f(...xss)") = forAll { (x1: Tree, x2: Tree) => - val q"f(...$xss)" = q"f($x1)($x2)" - xss ≈ List(List(x1), List(x2)) - } - - property("f(...$xss)(..$last)") = forAll { (x1: Tree, x2: Tree, x3: Tree) => - val q"f(...$xss)(..$last)" = q"f($x1)($x2)($x3)" - xss ≈ List(List(x1), List(x2)) && last ≈ List(x3) - } - - property("f(...$xss)(..$lastinit, $lastlast)") = forAll { (x1: Tree, x2: Tree, x3: Tree, x4: Tree) => - val q"f(...$xss)(..$lastinit, $lastlast)" = q"f($x1)($x2, $x3, $x4)" - xss ≈ List(List(x1)) && lastinit ≈ List(x2, x3) && lastlast ≈ x4 - } - - property("f(...xss) = f") = forAll { (x1: Tree, x2: Tree) => - val q"f(...$xss)" = q"f" - xss ≈ List() - } - - property("deconstruct unit as tuple") = test { - val q"(..$xs)" = q"()" - assert(xs.isEmpty) - } - - property("deconstruct tuple") = test { - val q"(..$xs)" = q"(a, b)" - assert(xs ≈ List(q"a", q"b")) - } - - property("deconstruct tuple mixed") = test { - val q"($first, ..$rest)" = q"(a, b, c)" - assert(first ≈ q"a") - assert(rest ≈ List(q"b", q"c")) - } - - property("deconstruct tuple last element") = test { - val q"($first, ..$rest, $last)" = q"(a, b, c, d)" - assert(first ≈ q"a") - assert(rest ≈ List(q"b", q"c")) - assert(last ≈ q"d") - } - - property("deconstruct expr as tuple") = test { - val q"(..$elems)" = q"foo" - assert(elems ≈ List(q"foo")) - } - - property("deconstruct cases") = test { - val q"$x match { case ..$cases }" = q"x match { case 1 => case 2 => }" - assert(x ≈ q"x") - assert(cases ≈ List(cq"1 =>", cq"2 =>")) - } - - property("deconstruct splitting last case") = test { - val q"$_ match { case ..$cases case $last }" = q"x match { case 1 => case 2 => case 3 => }" - assert(cases ≈ List(cq"1 =>", cq"2 =>")) - assert(last ≈ cq"3 =>") - } - - property("deconstruct block") = test { - val q"{ ..$xs }" = q"{ x1; x2; x3 }" - assert(xs ≈ List(q"x1", q"x2", q"x3")) - } - - property("deconstruct last element of a block") = test { - val q"{ ..$xs; $x }" = q"x1; x2; x3; x4" - assert(xs ≈ List(q"x1", q"x2", q"x3")) - assert(x ≈ q"x4") - } - - property("exhaustive function matcher") = test { - def matches(line: String) { val q"(..$args) => $body" = parse(line) } - matches("() => bippy") - matches("(y: Y) => y oh y") - matches("(x: X, y: Y) => x and y") - } - - property("exhaustive new pattern") = test { - def matches(line: String) { - val q"new { ..$early } with $name[..$targs](...$vargss) with ..$mixin { $self => ..$body }" = parse(line) - } - matches("new foo") - matches("new foo { body }") - matches("new foo[t]") - matches("new foo(x)") - matches("new foo[t](x)") - matches("new foo[t](x) { body }") - matches("new foo with bar") - matches("new foo with bar { body }") - matches("new { anonymous }") - matches("new { val early = 1 } with Parent[Int] { body }") - matches("new Foo { selfie => }") - } - - property("exhaustive assign pattern") = test { - def matches(tree: Tree) { val q"$rhs = $lhs" = tree } - matches(parse("left = right")) - matches(parse("arr(1) = 2")) - matches(AssignOrNamedArg(EmptyTree, EmptyTree)) - } - - property("deconstruct update 1") = test { - val q"$obj(..$args) = $value" = q"foo(bar) = baz" - assert(obj ≈ q"foo") - assert(args ≈ List(q"bar")) - assert(value ≈ q"baz") - } - - property("deconstruct update 2") = test { - val q"$left = $value" = q"foo(bar) = baz" - assert(left ≈ q"foo(bar)") - assert(value ≈ q"baz") - } - - property("deconstruct while loop") = test { - val q"while($cond) $body" = parse("while(cond) body") - assert(cond ≈ q"cond") - assert(body ≈ q"body") - } - - property("deconstruct do while loop") = test { - val q"do $body while($cond)" = parse("do body while(cond)") - assert(cond ≈ q"cond") - assert(body ≈ q"body") - } - - property("deconstruct anonymous function with placeholders") = test { - val q"{ $f(_) }" = q"{ foo(_) }" - assert(f ≈ q"foo") - val q"{ _.$member }" = q"{ _.foo }" - assert(member ≈ TermName("foo")) - val q"{ _ + $x }" = q"{ _ + x }" - assert(x ≈ q"x") - val q"{ _ * _ }" = q"{ _ * _ }" - } - - property("si-8275 a") = test { - val cq"_ => ..$stats" = cq"_ => foo; bar" - assert(stats ≈ List(q"foo", q"bar")) - } - - property("si-8275 b") = test { - val cq"_ => ..$init; $last" = cq"_ => a; b; c" - assert(init ≈ List(q"a", q"b")) - assert(last ≈ q"c") - } - - property("si-8275 c") = test { - val cq"_ => ..$stats" = cq"_ =>" - assert(stats.isEmpty) - assertEqAst(q"{ case _ => ..$stats }", "{ case _ => }") - } - - property("can't flatten type into block") = test { - assertThrows[IllegalArgumentException] { - val tpt = tq"List[Int]" - q"..$tpt; ()" - } - } - - property("term select doesn't match type select") = test { - assertThrows[MatchError] { - val q"$qual.$name" = tq"foo.bar" - } - } - - property("type application doesn't match applied type") = test { - assertThrows[MatchError] { - val q"$f[..$targs]" = tq"foo[bar]" - } - } - - property("match doesn't match partial function") = test { - assertThrows[MatchError] { - val q"$_ match { case ..$_ }" = q"{ case _ => }" - } - } - - property("deconstruct partial function") = test { - val q"{ case ..$cases }" = q"{ case a => b case c => d }" - val List(cq"a => b", cq"c => d") = cases - } - - property("SI-8350 `new C` and `new C()` are equivalent") = test { - val q"new C" = q"new C()" - val q"new C()" = q"new C" - } - - property("SI-8350 new applications extracted only for non-empty ctor calls") = test{ - val q"new $c1" = q"new C()" - assert(c1 ≈ tq"C") - val q"new $c2" = q"new C(x)" - assert(c2 ≈ q"${tq"C"}(x)") - } - - property("SI-8350 original test case") = test { - val q"new ..$parents" = q"new Foo with Bar" - assert(parents ≈ List(tq"Foo", tq"Bar")) - } - - property("SI-8387 new is not an application") = test { - val `new` = q"new F(x)" - val q"$f(...$argss)" = `new` - assert(f ≈ `new`) - assert(argss.isEmpty) - } - - property("SI-8703 extract block with single expression") = test { - val q"{ $a }" = Block(Nil, q"1") - val Literal(Constant(1)) = a - val q"{ $b }" = q"2" - val Literal(Constant(2)) = b - } -} diff --git a/test/files/scalacheck/quasiquotes/Test.scala b/test/files/scalacheck/quasiquotes/Test.scala deleted file mode 100644 index 7a26fa4923..0000000000 --- a/test/files/scalacheck/quasiquotes/Test.scala +++ /dev/null @@ -1,19 +0,0 @@ -import org.scalacheck._ - -object Test extends Properties("quasiquotes") { - include(TermConstructionProps) - include(TermDeconstructionProps) - include(TypeConstructionProps) - include(TypeDeconstructionProps) - include(PatternConstructionProps) - include(PatternDeconstructionProps) - include(LiftableProps) - include(UnliftableProps) - include(ErrorProps) - include(RuntimeErrorProps) - include(DefinitionConstructionProps) - include(DefinitionDeconstructionProps) - include(DeprecationProps) - include(ForProps) - include(TypecheckedProps) -} diff --git a/test/files/scalacheck/quasiquotes/TypeConstructionProps.scala b/test/files/scalacheck/quasiquotes/TypeConstructionProps.scala deleted file mode 100644 index 27ad4c50e9..0000000000 --- a/test/files/scalacheck/quasiquotes/TypeConstructionProps.scala +++ /dev/null @@ -1,42 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._, internal.reificationSupport.ScalaDot - -object TypeConstructionProps extends QuasiquoteProperties("type construction") { - property("bare idents contain type names") = test { - tq"x" ≈ Ident(TypeName("x")) - } - - property("unquote type names into AppliedTypeTree") = forAll { (name1: TypeName, name2: TypeName) => - tq"$name1[$name2]" ≈ AppliedTypeTree(Ident(name1), List(Ident(name2))) - } - - property("tuple type") = test { - val empty = List[Tree]() - val ts = List(tq"t1", tq"t2") - assert(tq"(..$empty)" ≈ ScalaDot(TypeName("Unit"))) - assert(tq"(..$ts)" ≈ tq"scala.Tuple2[t1, t2]") - assert(tq"(t0, ..$ts)" ≈ tq"scala.Tuple3[t0, t1, t2]") - } - - property("single-element tuple type") = test { - val ts = q"T" :: Nil - assert(tq"(..$ts)" ≈ ts.head) - } - - property("refined type") = test { - val stats = q"def foo" :: q"val x: Int" :: q"type Y = String" :: Nil - assert(tq"T { ..$stats }" ≈ tq"T { def foo; val x: Int; type Y = String }") - } - - property("function type") = test { - val argtpes = tq"A" :: tq"B" :: Nil - val restpe = tq"C" - assert(tq"..$argtpes => $restpe" ≈ tq"(A, B) => C") - } - - property("empty tq") = test { - val tt: TypeTree = tq"" - assert(tt.tpe == null) - assert(tt.original == null) - } -} diff --git a/test/files/scalacheck/quasiquotes/TypeDeconstructionProps.scala b/test/files/scalacheck/quasiquotes/TypeDeconstructionProps.scala deleted file mode 100644 index 7572b27b52..0000000000 --- a/test/files/scalacheck/quasiquotes/TypeDeconstructionProps.scala +++ /dev/null @@ -1,78 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._ - -object TypeDeconstructionProps extends QuasiquoteProperties("type deconstruction") { - property("ident(type name)") = forAll { (name: TypeName) => - val t = Ident(name) - val tq"$t1" = t - t1 ≈ t - } - - property("applied type tree") = forAll { (name1: TypeName, name2: TypeName) => - val tq"$a[$b]" = AppliedTypeTree(Ident(name1), List(Ident(name2))) - a ≈ Ident(name1) && b ≈ Ident(name2) - } - - property("tuple type (1)") = test { - val tq"(..$empty)" = tq"_root_.scala.Unit" - assert(empty.isEmpty) - } - - property("tuple type (2)") = test { - val tq"(..$ts)" = tq"(t1, t2)" - assert(ts ≈ List(tq"t1", tq"t2")) - } - - property("tuple type (3)") = test { - val tq"($head, ..$tail)" = tq"(t0, t1, t2)" - assert(head ≈ tq"t0") - assert(tail ≈ List(tq"t1", tq"t2")) - } - - property("tuple type (4)") = test { - val tq"(..$init, $last)" = tq"(t0, t1, t2)" - assert(init ≈ List(tq"t0", tq"t1")) - assert(last ≈ tq"t2") - } - - property("tuple type (5)") = test { - val tq"(..$ts)" = tq"T" - assert(ts ≈ List(tq"T")) - } - - property("refined type") = test { - val tq"T { ..$stats }" = tq"T { def foo; val x: Int; type Y = String }" - assert(stats ≈ List(q"def foo", q"val x: Int", q"type Y = String")) - } - - property("function type (1)") = test { - val tq"..$argtpes => $restpe" = tq"(A, B) => C" - assert(argtpes ≈ List(tq"A", tq"B")) - assert(restpe ≈ tq"C") - } - - property("function type (2)") = test { - val tq"(..$argtpes, $arglast) => $restpe" = tq"(A, B, C) => D" - assert(argtpes ≈ List(tq"A", tq"B")) - assert(arglast ≈ tq"C") - assert(restpe ≈ tq"D") - } - - property("match empty type tree") = test { - val tq"" = TypeTree() - // matches because type tree isn't syntactic without original - val tq"" = tq"${typeOf[Int]}" - } - - property("type select doesn't match term select") = test { - assertThrows[MatchError] { - val tq"$qual.$name" = q"foo.bar" - } - } - - property("applied type doesn't match type appliction") = test { - assertThrows[MatchError] { - val tq"$tpt[..$tpts]" = q"foo[bar]" - } - } -} diff --git a/test/files/scalacheck/quasiquotes/TypecheckedProps.scala b/test/files/scalacheck/quasiquotes/TypecheckedProps.scala deleted file mode 100644 index 07bff40f13..0000000000 --- a/test/files/scalacheck/quasiquotes/TypecheckedProps.scala +++ /dev/null @@ -1,215 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._, internal.reificationSupport._ - -object TypecheckedProps extends QuasiquoteProperties("typechecked") - with TypecheckedTypes { - property("tuple term") = test { - val q"(..$elements)" = typecheck(q"(1, 2)") - assert(elements ≈ List(q"1", q"2")) - } - - property("for/for-yield") = test { - val enums = fq"x <- xs" :: fq"x1 = x + 1" :: fq"if x1 % 2 == 0" :: Nil - val body = q"x1" - val xs = q"val xs = List(1, 2, 3)" - val q"$_; for(..$enums0) yield $body0" = typecheck(q"$xs; for(..$enums) yield $body") - assert(enums0 ≈ enums) - assert(body0 ≈ body) - val q"$_; for(..$enums1) $body1" = typecheck(q"$xs; for(..$enums) $body") - assert(enums1 ≈ enums) - assert(body1 ≈ body) - } - - property("for .filter instead of .withFilter") = test { - val enums = fq"foo <- new Foo" :: fq"if foo != null" :: Nil - val body = q"foo" - val q"$_; for(..$enums1) yield $body1" = typecheck(q""" - class Foo { def map(f: Any => Any) = this; def withFilter(cond: Any => Boolean) = this } - for(..$enums) yield $body - """) - assert(enums1 ≈ enums) - assert(body1 ≈ body) - } - - property("extract UnApply (1)") = test { - val q"object $_ { $_; $_; $m }" = typecheck(q""" - object Test { - class Cell(val x: Int) - object Cell { def unapply(c: Cell) = Some(c.x) } - new Cell(0) match { case Cell(v) => v } - } - """) - val q"$_ match { case $f(..$args) => $_ }" = m - assert(f ≈ pq"Test.this.Cell") - assert(args ≈ List(pq"v")) - } - - property("extract UnApply (2)") = test { - val q"object $_ { $_; $m }" = typecheck(q""" - object Test { - case class Cell(val x: Int) - new Cell(0) match { case Cell(v) => v } - } - """) - val q"$_ match { case ${f: TypeTree}(..$args) => $_ }" = m - assert(f.original ≈ pq"Test.this.Cell") - assert(args ≈ List(pq"v")) - } - - property("extract inferred val type") = test { - val typechecked = typecheck(q"val x = 42") - val q"val x = 42" = typechecked - val q"val x: ${tq""} = 42" = typechecked - val q"val x: ${t: Type} = 42" = typechecked - } - - property("class with param (1)") = test { - val paramName = TermName("x") - val q"class $_($param)" = typecheck(q"class Test(val $paramName: Int)") - - assert(param.name == paramName) - } - - property("class with param (2)") = test { - val paramName = TermName("y") - val q"{class $_($param)}" = typecheck(q"class Test(val $paramName: Int = 3)") - - assert(param.name == paramName) - assert(param.rhs ≈ q"3") - } - - property("class with params") = test { - val pName1 = TermName("x1") - val pName2 = TermName("x2") - val q"{class $_($param1)(..$params2)}" = typecheck(q"class Test(val x0: Float)(val $pName1: Int = 3, $pName2: String)") - - val List(p1, p2, _*) = params2 - - assert(p1.name == pName1) - assert(p2.name == pName2) - assert(params2.size == 2) - } - - property("implicit class") = test { - val clName = TypeName("Test") - val paramName = TermName("x") - val q"{implicit class $name($param)}" = typecheck(q"implicit class $clName(val $paramName: String)") - - assert(name == clName) - assert(param.name == paramName) - } - - property("block with lazy") = test { - val lazyName = TermName("x") - val lazyRhsVal = 42 - val lazyRhs = Literal(Constant(lazyRhsVal)) - val q"{ $mods val $pname: $_ = $rhs }" = typecheck(q"{lazy val $lazyName = $lazyRhsVal}") - - assert(pname == lazyName) - assert(rhs ≈ lazyRhs) - } - - property("class with lazy") = test { - val clName = TypeName("Test") - val paramName = TermName("x") - val q"class $name{lazy val $pname = $_}" = typecheck(q"class $clName {lazy val $paramName = 42}") - - assert(name == clName) - assert(pname == paramName) - } - - property("case class with object") = test { - val defName = TermName("z") - val defRhsVal = 42 - val defRhs = Literal(Constant(defRhsVal)) - val q"object $_{ $_; object $_ extends ..$_ {def $name = $rhs} }" = - typecheck(q""" - object Test{ - case class C(x: Int) { def y = x }; - object C { def $defName = $defRhsVal } - }""") - - assert(name == defName) - assert(rhs ≈ defRhs) - } - - property("partial function") = test { - val q"{ case ..$cases }: $ascr" = typecheck(q"{ case 1 => () }: PartialFunction[Int, Unit]") - assert(cases ≈ q"{ case 1 => () }".cases) - } -} - -trait TypecheckedTypes { self: QuasiquoteProperties => - property("type ident") = test { - val q"$_; type $_ = $tpt" = typecheck(q"class C; type T = C") - val tq"C" = tpt - } - - property("type select") = test { - val tq"scala.Int" = typecheckTyp(tq"Int") - } - - property("this type select") = test { - val q"class $_ { $_; type $_ = $tpt }" = typecheck(q"class C { type A = Int; type B = this.A }") - val tq"this.$name" = tpt - val TypeName("A") = name - } - - property("super type select") = test { - val q"$_; class $_ extends $_ { type $_ = $tpt }" = - typecheck(q"class C1 { type A = Int }; class C2 extends C1 { type B = super[C1].A }") - val tq"$empty.super[$c1].$a" = tpt - val TypeName("") = empty - val TypeName("C1") = c1 - val TypeName("A") = a - } - - property("applied type") = test { - val tt = typecheckTyp(tq"Map[Int, Int]") - val tq"$tpt[..$tpts]" = tt - val tq"scala.Predef.Map" = tpt - val List(tq"scala.Int", tq"scala.Int") = tpts - } - - property("tuple type") = test { - val tq"(..$els0)" = typecheckTyp(tq"Unit") - assert(els0.isEmpty) - val tq"(..$els1)" = typecheckTyp(tq"(Int, Int)") - val List(tq"scala.Int", tq"scala.Int") = els1 - } - - property("function type") = test { - val tq"(..$argtpes) => $restpe" = typecheckTyp(tq"(Int, Int) => Int") - val List(tq"scala.Int", tq"scala.Int") = argtpes - val tq"scala.Int" = restpe - } - - property("compound type") = test { - val tq"..$parents { ..$defns }" = typecheckTyp(tq"Int { def x: Int }") - val List(tq"Int") = parents - val List(q"def x: Int") = defns - } - - property("singleton type") = test { - val tq"$ref.type" = typecheckTyp(tq"scala.Predef.type") - val q"scala.Predef" = ref - } - - property("type projection") = test { - val tq"$tpt#$name" = typecheckTyp(tq"({ type T = Int })#T") - val TypeName("T") = name - val tq"{ type T = Int }" = tpt - } - - property("annotated type") = test { - val tq"$tpt @$annot" = typecheckTyp(tq"Int @unchecked") - val tq"scala.Int" = tpt - val tq"unchecked" = annot - } - - property("existential type") = test { - val tq"$tpt forSome { ..$defns }" = typecheckTyp(tq"T forSome { type T }") - val tq"T" = tpt - val q"type T" :: Nil = defns - } -} diff --git a/test/files/scalacheck/quasiquotes/UnliftableProps.scala b/test/files/scalacheck/quasiquotes/UnliftableProps.scala deleted file mode 100644 index 659b18edab..0000000000 --- a/test/files/scalacheck/quasiquotes/UnliftableProps.scala +++ /dev/null @@ -1,166 +0,0 @@ -import org.scalacheck._, Prop._, Gen._, Arbitrary._ -import scala.reflect.runtime.universe._, Flag._ - -object UnliftableProps extends QuasiquoteProperties("unliftable") { - property("unlift name") = test { - val termname0 = TermName("foo") - val typename0 = TypeName("foo") - val q"${termname1: TermName}" = Ident(termname0) - assert(termname1 == termname0) - val q"${typename1: TypeName}" = Ident(typename0) - assert(typename1 == typename0) - val q"${name1: Name}" = Ident(termname0) - assert(name1 == termname0) - val q"${name2: Name}" = Ident(typename0) - assert(name2 == typename0) - } - - property("unlift type") = test { - val q"${tpe: Type}" = TypeTree(typeOf[Int]) - assert(tpe =:= typeOf[Int]) - } - - property("unlift constant") = test { - val q"${const: Constant}" = Literal(Constant("foo")) - assert(const == Constant("foo")) - } - - property("unlift char") = test { - val q"${c: Char}" = Literal(Constant('0')) - assert(c.isInstanceOf[Char] && c == '0') - } - - property("unlift byte") = test { - val q"${b: Byte}" = Literal(Constant(0: Byte)) - assert(b.isInstanceOf[Byte] && b == 0) - } - - property("unlift short") = test { - val q"${s: Short}" = Literal(Constant(0: Short)) - assert(s.isInstanceOf[Short] && s == 0) - } - - property("unlift int") = test { - val q"${i: Int}" = Literal(Constant(0: Int)) - assert(i.isInstanceOf[Int] && i == 0) - } - - property("unlift long") = test { - val q"${l: Long}" = Literal(Constant(0L: Long)) - assert(l.isInstanceOf[Long] && l == 0L) - } - - property("unlift float") = test { - val q"${f: Float}" = Literal(Constant(0.0f: Float)) - assert(f.isInstanceOf[Float] && f == 0.0f) - } - - property("unlift double") = test { - val q"${d: Double}" = Literal(Constant(0.0: Double)) - assert(d.isInstanceOf[Double] && d == 0.0) - } - - property("unlift bool") = test { - val q"${b: Boolean}" = q"true" - assert(b.isInstanceOf[Boolean] && b == true) - } - - property("unlift string") = test { - val q"${s: String}" = q""" "foo" """ - assert(s.isInstanceOf[String] && s == "foo") - } - - property("unlift scala.symbol") = test { - val q"${s: scala.Symbol}" = q"'foo" - assert(s.isInstanceOf[scala.Symbol] && s == 'foo) - } - - implicit def unliftList[T: Unliftable]: Unliftable[List[T]] = Unliftable { - case q"scala.collection.immutable.List(..$args)" if args.forall { implicitly[Unliftable[T]].unapply(_).nonEmpty } => - val ut = implicitly[Unliftable[T]] - args.flatMap { ut.unapply(_) } - } - - property("unlift list (1)") = test { - val orig = List(1, 2) - val q"${l1: List[Int]}" = q"$orig" // q"List(1, 2)" - assert(l1 == orig) - val q"f(..${l2: List[Int]})" = q"f(..$orig)" // q"f(1, 2) - assert(l2 == orig) - } - - property("unlift list (2)") = test { - val orig2 = List(List(1, 2), List(3)) - val q"f(${l3: List[List[Int]]})" = q"f($orig2)" // q"f(List(List(1, 2), List(3))) - assert(l3 == orig2) - val q"f(..${l4: List[List[Int]]})" = q"f(..$orig2)" // q"f(List(1, 2), List(3))" - assert(l4 == orig2) - val q"f(...${l5: List[List[Int]]})" = q"f(...$orig2)" // q"f(1, 2)(3) - assert(l5 == orig2) - } - - property("don't unlift non-tree unquotee (1)") = test { - val q"${a: TermName}.${b: TermName}" = q"a.b" - assert(a == TermName("a")) - assert(b == TermName("b")) - } - - property("don't unlift non-tree unquotee (2)") = test { - val q"${mods: Modifiers} def foo" = q"def foo" - assert(mods == Modifiers(DEFERRED)) - } - - property("unlift tuple") = test { - val q"${t2: (Int, Int)}" = q"(1, 2)" - val q"${t3: (Int, Int, Int)}" = q"(1, 2, 3)" - val q"${t4: (Int, Int, Int, Int)}" = q"(1, 2, 3, 4)" - val q"${t5: (Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5)" - val q"${t6: (Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6)" - val q"${t7: (Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7)" - val q"${t8: (Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8)" - val q"${t9: (Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9)" - val q"${t10: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)" - val q"${t11: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)" - val q"${t12: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)" - val q"${t13: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)" - val q"${t14: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)" - val q"${t15: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)" - val q"${t16: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)" - val q"${t17: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)" - val q"${t18: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)" - val q"${t19: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)" - val q"${t20: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)" - val q"${t21: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)" - val q"${t22: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int)}" = q"(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22)" - // assert(t1 == Tuple1(1)) - assert(t2 == (1, 2)) - assert(t3 == (1, 2, 3)) - assert(t4 == (1, 2, 3, 4)) - assert(t5 == (1, 2, 3, 4, 5)) - assert(t6 == (1, 2, 3, 4, 5, 6)) - assert(t7 == (1, 2, 3, 4, 5, 6, 7)) - assert(t8 == (1, 2, 3, 4, 5, 6, 7, 8)) - assert(t9 == (1, 2, 3, 4, 5, 6, 7, 8, 9)) - assert(t10 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) - assert(t11 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)) - assert(t12 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)) - assert(t13 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)) - assert(t14 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)) - assert(t15 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)) - assert(t16 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)) - assert(t17 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)) - assert(t18 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)) - assert(t19 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)) - assert(t20 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)) - assert(t21 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)) - assert(t22 == (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22)) - } - - property("unlift xml comment") = test { - implicit val unliftXmlComment = Unliftable[xml.Comment] { - case q"new _root_.scala.xml.Comment(${value: String})" => xml.Comment(value) - } - val q"${comment: xml.Comment}" = q"<!--foo-->" - assert(comment.commentText == "foo") - } -} diff --git a/test/files/scalacheck/range.scala b/test/files/scalacheck/range.scala deleted file mode 100644 index ac24b52f8d..0000000000 --- a/test/files/scalacheck/range.scala +++ /dev/null @@ -1,314 +0,0 @@ -import org.scalacheck._ -import Prop._ -import Gen._ -import Arbitrary._ - -class Counter(r: Range) { - var cnt = 0L - var last: Option[Int] = None - val str = "Range["+r.start+", "+r.end+", "+r.step+(if (r.isInclusive) "]" else ")") - def apply(x: Int) = { - cnt += 1L - if (cnt % 500000000L == 0L) { - println("Working: %s %d %d" format (str, cnt, x)) - } - if (cnt > (Int.MaxValue.toLong + 1) * 2) { - val msg = "Count exceeds maximum possible for an Int Range: %s" format str - println(msg) // exception is likely to be eaten by an out of memory error - sys error msg - } - if ((r.step > 0 && last.exists(_ > x)) || (r.step < 0 && last.exists(_ < x))) { - val msg = "Range %s wrapped: %d %s" format (str, x, last.toString) - println(msg) // exception is likely to be eaten by an out of memory error - sys error msg - } - last = Some(x) - } -} - -abstract class RangeTest(kind: String) extends Properties("Range "+kind) { - def myGen: Gen[Range] - - def genReasonableSizeRange = oneOf(genArbitraryRange, genBoundaryRange) - - def genArbitraryRange = for { - start <- choose(Int.MinValue, Int.MaxValue) - end <- choose(Int.MinValue, Int.MaxValue) - step <- choose(-Int.MaxValue, Int.MaxValue) - } yield Range(start, end, if (step == 0) 100 else step) - - def genBoundaryRange = for { - boundary <- oneOf(Int.MinValue, -1, 0, 1, Int.MaxValue) - isStart <- arbitrary[Boolean] - size <- choose(1, 100) - step <- choose(1, 101) - } yield { - val signum = if (boundary == 0) 1 else boundary.signum - if (isStart) Range(boundary, boundary - size * boundary.signum, - step * signum) - else Range(boundary - size * boundary.signum, boundary, step * signum) - } - - - def genSmallRange = for { - start <- choose(-100, 100) - end <- choose(-100, 100) - step <- choose(1, 1) - } yield if (start < end) Range(start, end, step) else Range(start, end, -step) - - def genRangeByOne = oneOf(genRangeOpenByOne, genRangeClosedByOne) - - def genRangeOpenByOne = for { - r <- oneOf(genSmallRange, genBoundaryRange) - if (r.end.toLong - r.start.toLong).abs <= 10000000L - } yield if (r.start < r.end) Range(r.start, r.end) else Range(r.end, r.start) - - def genRangeClosedByOne = for (r <- genRangeOpenByOne) yield r.start to r.end - - def str(r: Range) = "Range["+r.start+", "+r.end+", "+r.step+(if (r.isInclusive) "]" else ")") - - def expectedSize(r: Range): Long = if (r.isInclusive) { - (r.end.toLong - r.start.toLong < 0, r.step < 0) match { - case (true, true) | (false, false) => (r.end.toLong - r.start.toLong).abs / r.step.abs.toLong + 1L - case _ => if (r.start == r.end) 1L else 0L - } - } else { - (r.end.toLong - r.start.toLong < 0, r.step < 0) match { - case (true, true) | (false, false) => ( - (r.end.toLong - r.start.toLong).abs / r.step.abs.toLong - + (if ((r.end.toLong - r.start.toLong).abs % r.step.abs.toLong > 0L) 1L else 0L) - ) - case _ => 0L - } - } - - def within(r: Range, x: Int) = if (r.step > 0) - r.start <= x && (if (r.isInclusive) x <= r.end else x < r.end) - else - r.start >= x && (if (r.isInclusive) x >= r.end else x > r.end) - - def multiple(r: Range, x: Int) = (x.toLong - r.start) % r.step == 0 - - property("foreach.step") = forAllNoShrink(myGen) { r => -// println("foreach.step "+str(r)) - var allValid = true - val cnt = new Counter(r) -// println("--------------------") -// println(r) - r foreach { x => cnt(x) -// println(x + ", " + (x - r.start) + ", " + (x.toLong - r.start) + ", " + ((x.toLong - r.start) % r.step)) - allValid &&= multiple(r, x) - } - allValid :| str(r) - } - - property("foreach.inside.range") = forAll(myGen) { r => -// println("foreach.inside.range "+str(r)) - var allValid = true - var last: Option[Int] = None - val cnt = new Counter(r) - r foreach { x => cnt(x) - allValid &&= within(r, x) - } - allValid :| str(r) - } - - property("foreach.visited.size") = forAll(myGen) { r => -// println("foreach.visited.size "+str(r)) - var visited = 0L - val cnt = new Counter(r) - r foreach { x => cnt(x) - visited += 1L - } -// println("----------") -// println(str(r)) -// println("size: " + r.size) -// println("expected: " + expectedSize(r)) -// println("visited: " + visited) - (visited == expectedSize(r)) :| str(r) - } - - property("sum") = forAll(myGen) { r => -// println("----------") -// println("sum "+str(r)) - val rSum = r.sum - val expected = r.length match { - case 0 => 0 - case 1 => r.head - case x if x < 1000 => - // Explicit sum, to guard against having the same mistake in both the - // range implementation and test implementation of sum formula. - // (Yes, this happened before.) - var i = r.head - var s = 0L - var n = x - while (n > 0) { - s += i - i += r.step - n -= 1 - } - s.toInt - case _ => - // Make sure head + last doesn't overflow! - ((r.head.toLong + r.last) * r.length / 2).toInt - } -// println("size: " + r.length) -// println("expected: " + expected) -// println("obtained: " + rSum) - - (rSum == expected) :| str(r) - } - -/* checks that sum respects custom Numeric */ - property("sumCustomNumeric") = forAll(myGen) { r => - val mod = 65536 - object mynum extends Numeric[Int] { - def plus(x: Int, y: Int): Int = (x + y) % mod - override def zero = 0 - - def fromInt(x: Int): Int = ??? - def minus(x: Int, y: Int): Int = ??? - def negate(x: Int): Int = ??? - def times(x: Int, y: Int): Int = ??? - def toDouble(x: Int): Double = ??? - def toFloat(x: Int): Float = ??? - def toInt(x: Int): Int = ((x % mod) + mod * 2) % mod - def toLong(x: Int): Long = ??? - def compare(x: Int, y: Int): Int = ??? - } - - val rSum = r.sum(mynum) - val expected = mynum.toInt(r.sum) - - (rSum == expected) :| str(r) - } - - - property("length") = forAll(myGen suchThat (r => expectedSize(r).toInt == expectedSize(r))) { r => -// println("length "+str(r)) - (r.length == expectedSize(r)) :| str(r) - } - - property("isEmpty") = forAll(myGen suchThat (r => expectedSize(r).toInt == expectedSize(r))) { r => -// println("isEmpty "+str(r)) - (r.isEmpty == (expectedSize(r) == 0L)) :| str(r) - } - - property("contains") = forAll(myGen, arbInt.arbitrary) { (r, x) => -// println("contains "+str(r)) -// println("----------------") -// println(str(r)) -// println(x) -// println("within: " + within(r, x)) -// println("multiple: " + multiple(r, x)) -// println("contains: " + r.contains(x)) - ((within(r, x) && multiple(r, x)) == r.contains(x)) :| str(r)+": "+x - } - - property("take") = forAll(myGen suchThat (r => expectedSize(r).toInt == expectedSize(r)), arbInt.arbitrary) { (r, x) => -// println("take "+str(r)) - val t = r take x - (t.size == (0 max x min r.size) && t.start == r.start && t.step == r.step) :| str(r)+" / "+str(t)+": "+x - } - - property("init") = forAll(myGen suchThat (r => expectedSize(r).toInt == expectedSize(r))) { r => -// println("init "+str(r)) - (r.size == 0) || { - val t = r.init - (t.size + 1 == r.size) && (t.isEmpty || t.head == r.head) - } - } - - property("takeWhile") = forAll(myGen suchThat (r => expectedSize(r).toInt == expectedSize(r)), arbInt.arbitrary) { (r, x) => -// println("takeWhile "+str(r)) - val t = (if (r.step > 0) r takeWhile (_ <= x) else r takeWhile(_ >= x)) - if (r.size == 0) { - (t.size == 0) :| str(r)+" / "+str(t)+": "+x - } else { - val t2 = (if (r.step > 0) Range(r.start, x min r.last, r.step).inclusive else Range(r.start, x max r.last, r.step).inclusive) - (t.start == r.start && t.size == t2.size && t.step == r.step) :| str(r)+" / "+str(t)+" / "+str(t2)+": "+x - } - } - - property("reverse.toSet.equal") = forAll(myGen) { r => -// println("reverse.toSet.equal "+str(r)) - val reversed = r.reverse - val aresame = r.toSet == reversed.toSet - if (!aresame) { - println(str(r)) - println(r) - println(reversed) - println(r.toSet) - println(reversed.toSet) - } - aresame :| str(r) - } -} - -object NormalRangeTest extends RangeTest("normal") { - override def myGen = genReasonableSizeRange - def genOne = for { - start <- arbitrary[Int] - end <- arbitrary[Int] - if (start.toLong - end.toLong).abs < Int.MaxValue.toLong - } yield Range(start, end, if (start < end) 1 else - 1) - property("by 1.size + 1 == inclusive.size") = forAll(genOne) { r => - (r.size + 1 == r.inclusive.size) :| str(r) - } -} - -object InclusiveRangeTest extends RangeTest("inclusive") { - override def myGen = for (r <- genReasonableSizeRange) yield r.inclusive -} - -object ByOneRangeTest extends RangeTest("byOne") { - override def myGen = genRangeByOne -} - -object InclusiveByOneRangeTest extends RangeTest("inclusiveByOne") { - override def myGen = for (r <- genRangeByOne) yield r.inclusive -} - -object SmallValuesRange extends RangeTest("smallValues") { - override def myGen = genSmallRange -} - -object TooLargeRange extends Properties("Too Large Range") { - val genTooLargeStart = for { - start <- choose(-Int.MinValue, 0) - } yield start - - property("Too large range throws exception") = forAll(genTooLargeStart) { start => - try { - val r = Range.inclusive(start, Int.MaxValue, 1) - val l = r.length - println("how here? length = " + l + ", r = " + r.toString) - false - } - catch { case _: IllegalArgumentException => true } - } -} - -object Test extends Properties("Range") { - import org.scalacheck.{ Test => STest } - - include(NormalRangeTest) - include(InclusiveRangeTest) - include(ByOneRangeTest) - include(InclusiveByOneRangeTest) - include(TooLargeRange) -} - -/* Mini-benchmark -def testRange(i: Int, j: Int, k: Int) = { - var count = 0 - for { - vi <- 0 to i - vj <- 0 to j - vk <- 0 to k - } { count += 1 } -} - -testRange(10, 1000, 10000) -testRange(10000, 1000, 10) -*/ - diff --git a/test/files/scalacheck/redblacktree.scala b/test/files/scalacheck/redblacktree.scala deleted file mode 100644 index 4ded37b35a..0000000000 --- a/test/files/scalacheck/redblacktree.scala +++ /dev/null @@ -1,258 +0,0 @@ -import collection.immutable.{RedBlackTree => RB} -import org.scalacheck._ -import Prop._ -import Gen._ - -/* -Properties of a Red & Black Tree: - -A node is either red or black. -The root is black. (This rule is used in some definitions and not others. Since the -root can always be changed from red to black but not necessarily vice-versa this -rule has little effect on analysis.) -All leaves are black. -Both children of every red node are black. -Every simple path from a given node to any of its descendant leaves contains the same number of black nodes. -*/ - -package scala.collection.immutable.redblacktree { - abstract class RedBlackTreeTest extends Properties("RedBlackTree") { - def minimumSize = 0 - def maximumSize = 5 - - import RB._ - - def nodeAt[A](tree: Tree[String, A], n: Int): Option[(String, A)] = if (n < iterator(tree).size && n >= 0) - Some(iterator(tree).drop(n).next) - else - None - - def treeContains[A](tree: Tree[String, A], key: String) = iterator(tree).map(_._1) contains key - - def height(tree: Tree[_, _]): Int = if (tree eq null) 0 else (1 + math.max(height(tree.left), height(tree.right))) - - def mkTree(level: Int, parentIsBlack: Boolean = false, label: String = ""): Gen[Tree[String, Int]] = - if (level == 0) { - const(null) - } else { - for { - oddOrEven <- choose(0, 2) - tryRed = oddOrEven.sample.get % 2 == 0 // work around arbitrary[Boolean] bug - isRed = parentIsBlack && tryRed - nextLevel = if (isRed) level else level - 1 - left <- mkTree(nextLevel, !isRed, label + "L") - right <- mkTree(nextLevel, !isRed, label + "R") - } yield { - if (isRed) - RedTree(label + "N", 0, left, right) - else - BlackTree(label + "N", 0, left, right) - } - } - - def genTree = for { - depth <- choose(minimumSize, maximumSize + 1) - tree <- mkTree(depth) - } yield tree - - type ModifyParm - def genParm(tree: Tree[String, Int]): Gen[ModifyParm] - def modify(tree: Tree[String, Int], parm: ModifyParm): Tree[String, Int] - - def genInput: Gen[(Tree[String, Int], ModifyParm, Tree[String, Int])] = for { - tree <- genTree - parm <- genParm(tree) - } yield (tree, parm, modify(tree, parm)) - } - - trait RedBlackTreeInvariants { - self: RedBlackTreeTest => - - import RB._ - - def rootIsBlack[A](t: Tree[String, A]) = isBlack(t) - - def areAllLeavesBlack[A](t: Tree[String, A]): Boolean = t match { - case null => isBlack(t) - case ne => List(ne.left, ne.right) forall areAllLeavesBlack - } - - def areRedNodeChildrenBlack[A](t: Tree[String, A]): Boolean = t match { - case RedTree(_, _, left, right) => List(left, right) forall (t => isBlack(t) && areRedNodeChildrenBlack(t)) - case BlackTree(_, _, left, right) => List(left, right) forall areRedNodeChildrenBlack - case null => true - } - - def blackNodesToLeaves[A](t: Tree[String, A]): List[Int] = t match { - case null => List(1) - case BlackTree(_, _, left, right) => List(left, right) flatMap blackNodesToLeaves map (_ + 1) - case RedTree(_, _, left, right) => List(left, right) flatMap blackNodesToLeaves - } - - def areBlackNodesToLeavesEqual[A](t: Tree[String, A]): Boolean = t match { - case null => true - case ne => - ( - blackNodesToLeaves(ne).distinct.size == 1 - && areBlackNodesToLeavesEqual(ne.left) - && areBlackNodesToLeavesEqual(ne.right) - ) - } - - def orderIsPreserved[A](t: Tree[String, A]): Boolean = - iterator(t) zip iterator(t).drop(1) forall { case (x, y) => x._1 < y._1 } - - def heightIsBounded(t: Tree[_, _]): Boolean = height(t) <= (2 * (32 - Integer.numberOfLeadingZeros(count(t) + 2)) - 2) - - def setup(invariant: Tree[String, Int] => Boolean) = forAll(genInput) { case (tree, parm, newTree) => - invariant(newTree) - } - - property("root is black") = setup(rootIsBlack) - property("all leaves are black") = setup(areAllLeavesBlack) - property("children of red nodes are black") = setup(areRedNodeChildrenBlack) - property("black nodes are balanced") = setup(areBlackNodesToLeavesEqual) - property("ordering of keys is preserved") = setup(orderIsPreserved) - property("height is bounded") = setup(heightIsBounded) - } - - object TestInsert extends RedBlackTreeTest with RedBlackTreeInvariants { - import RB._ - - override type ModifyParm = Int - override def genParm(tree: Tree[String, Int]): Gen[ModifyParm] = choose(0, iterator(tree).size + 1) - override def modify(tree: Tree[String, Int], parm: ModifyParm): Tree[String, Int] = update(tree, generateKey(tree, parm), 0, true) - - def generateKey(tree: Tree[String, Int], parm: ModifyParm): String = nodeAt(tree, parm) match { - case Some((key, _)) => key.init.mkString + "MN" - case None => nodeAt(tree, parm - 1) match { - case Some((key, _)) => key.init.mkString + "RN" - case None => "N" - } - } - - property("update adds elements") = forAll(genInput) { case (tree, parm, newTree) => - treeContains(newTree, generateKey(tree, parm)) - } - } - - object TestModify extends RedBlackTreeTest { - import RB._ - - def newValue = 1 - override def minimumSize = 1 - override type ModifyParm = Int - override def genParm(tree: Tree[String, Int]): Gen[ModifyParm] = choose(0, iterator(tree).size) - override def modify(tree: Tree[String, Int], parm: ModifyParm): Tree[String, Int] = nodeAt(tree, parm) map { - case (key, _) => update(tree, key, newValue, true) - } getOrElse tree - - property("update modifies values") = forAll(genInput) { case (tree, parm, newTree) => - nodeAt(tree,parm) forall { case (key, _) => - iterator(newTree) contains (key, newValue) - } - } - } - - object TestDelete extends RedBlackTreeTest with RedBlackTreeInvariants { - import RB._ - - override def minimumSize = 1 - override type ModifyParm = Int - override def genParm(tree: Tree[String, Int]): Gen[ModifyParm] = choose(0, iterator(tree).size) - override def modify(tree: Tree[String, Int], parm: ModifyParm): Tree[String, Int] = nodeAt(tree, parm) map { - case (key, _) => delete(tree, key) - } getOrElse tree - - property("delete removes elements") = forAll(genInput) { case (tree, parm, newTree) => - nodeAt(tree, parm) forall { case (key, _) => - !treeContains(newTree, key) - } - } - } - - object TestRange extends RedBlackTreeTest with RedBlackTreeInvariants { - import RB._ - - override type ModifyParm = (Option[Int], Option[Int]) - override def genParm(tree: Tree[String, Int]): Gen[ModifyParm] = for { - from <- choose(0, iterator(tree).size) - to <- choose(0, iterator(tree).size) suchThat (from <=) - optionalFrom <- oneOf(Some(from), None, Some(from)) // Double Some(n) to get around a bug - optionalTo <- oneOf(Some(to), None, Some(to)) // Double Some(n) to get around a bug - } yield (optionalFrom, optionalTo) - - override def modify(tree: Tree[String, Int], parm: ModifyParm): Tree[String, Int] = { - val from = parm._1 flatMap (nodeAt(tree, _) map (_._1)) - val to = parm._2 flatMap (nodeAt(tree, _) map (_._1)) - rangeImpl(tree, from, to) - } - - property("range boundaries respected") = forAll(genInput) { case (tree, parm, newTree) => - val from = parm._1 flatMap (nodeAt(tree, _) map (_._1)) - val to = parm._2 flatMap (nodeAt(tree, _) map (_._1)) - ("lower boundary" |: (from forall ( key => keysIterator(newTree) forall (key <=)))) && - ("upper boundary" |: (to forall ( key => keysIterator(newTree) forall (key >)))) - } - - property("range returns all elements") = forAll(genInput) { case (tree, parm, newTree) => - val from = parm._1 flatMap (nodeAt(tree, _) map (_._1)) - val to = parm._2 flatMap (nodeAt(tree, _) map (_._1)) - val filteredTree = (keysIterator(tree) - .filter(key => from forall (key >=)) - .filter(key => to forall (key <)) - .toList) - filteredTree == keysIterator(newTree).toList - } - } - - object TestDrop extends RedBlackTreeTest with RedBlackTreeInvariants { - import RB._ - - override type ModifyParm = Int - override def genParm(tree: Tree[String, Int]): Gen[ModifyParm] = choose(0, iterator(tree).size) - override def modify(tree: Tree[String, Int], parm: ModifyParm): Tree[String, Int] = drop(tree, parm) - - property("drop") = forAll(genInput) { case (tree, parm, newTree) => - iterator(tree).drop(parm).toList == iterator(newTree).toList - } - } - - object TestTake extends RedBlackTreeTest with RedBlackTreeInvariants { - import RB._ - - override type ModifyParm = Int - override def genParm(tree: Tree[String, Int]): Gen[ModifyParm] = choose(0, iterator(tree).size) - override def modify(tree: Tree[String, Int], parm: ModifyParm): Tree[String, Int] = take(tree, parm) - - property("take") = forAll(genInput) { case (tree, parm, newTree) => - iterator(tree).take(parm).toList == iterator(newTree).toList - } - } - - object TestSlice extends RedBlackTreeTest with RedBlackTreeInvariants { - import RB._ - - override type ModifyParm = (Int, Int) - override def genParm(tree: Tree[String, Int]): Gen[ModifyParm] = for { - from <- choose(0, iterator(tree).size) - to <- choose(from, iterator(tree).size) - } yield (from, to) - override def modify(tree: Tree[String, Int], parm: ModifyParm): Tree[String, Int] = slice(tree, parm._1, parm._2) - - property("slice") = forAll(genInput) { case (tree, parm, newTree) => - iterator(tree).slice(parm._1, parm._2).toList == iterator(newTree).toList - } - } -} - -object Test extends Properties("RedBlackTree") { - import collection.immutable.redblacktree._ - include(TestInsert) - include(TestModify) - include(TestDelete) - include(TestRange) - include(TestDrop) - include(TestTake) - include(TestSlice) -} diff --git a/test/files/scalacheck/scan.scala b/test/files/scalacheck/scan.scala deleted file mode 100644 index fc214d739c..0000000000 --- a/test/files/scalacheck/scan.scala +++ /dev/null @@ -1,19 +0,0 @@ -import org.scalacheck._ -import Prop._ -import Gen._ - - - - -object Test extends Properties("TraversableLike.scanLeft") { - property("scanLeft") = forAll { (xs: List[Int], z: Int) => { - val sums = xs.scanLeft(z)(_ + _) - (xs.size == 0) || sums.zip(sums.tail).map(x => x._2 - x._1) == xs - }} -} - - - - - - diff --git a/test/files/scalacheck/substringTests.scala b/test/files/scalacheck/substringTests.scala deleted file mode 100644 index 76260b9dd2..0000000000 --- a/test/files/scalacheck/substringTests.scala +++ /dev/null @@ -1,20 +0,0 @@ -import org.scalacheck._ - - -object Test extends Properties("String") { - property("startsWith") = Prop.forAll((a: String, b: String) => (a+b).startsWith(a)) - - property("endsWith") = Prop.forAll((a: String, b: String) => (a+b).endsWith(b)) - - property("concat") = Prop.forAll((a: String, b: String) => - (a+b).length >= a.length && (a+b).length >= b.length - ) - - property("substring") = Prop.forAll((a: String, b: String) => - (a+b).substring(a.length) == b - ) - - property("substring") = Prop.forAll((a: String, b: String, c: String) => - (a+b+c).substring(a.length, a.length+b.length) == b - ) -} diff --git a/test/files/scalacheck/t2460.scala b/test/files/scalacheck/t2460.scala deleted file mode 100644 index ab2911447a..0000000000 --- a/test/files/scalacheck/t2460.scala +++ /dev/null @@ -1,27 +0,0 @@ -import org.scalacheck.Prop.forAll -import org.scalacheck.Properties -import org.scalacheck.{Test => SCTest} -import org.scalacheck.Gen - -object Test extends Properties("Regex : Ticket 2460") { - - val vowel = Gen.oneOf("a", "z") - - val numberOfMatch = forAll(vowel) { - (s: String) => "\\s*([a-z])\\s*".r("data").findAllMatchIn((1 to 20).map(_ => s).mkString).size == 20 - } - - val numberOfGroup = forAll(vowel) { - (s: String) => "\\s*([a-z])\\s*([a-z])\\s*".r("data").findAllMatchIn((1 to 20).map(_ => s).mkString).next.groupCount == 2 - } - - val nameOfGroup = forAll(vowel) { - (s: String) => "([a-z])".r("data").findAllMatchIn(s).next.group("data") == s - } - - val tests = List( - ("numberOfMatch", numberOfMatch), - ("numberOfGroup", numberOfGroup), - ("nameOfGroup", nameOfGroup) - ) -} diff --git a/test/files/scalacheck/t4147.scala b/test/files/scalacheck/t4147.scala deleted file mode 100644 index 72f6e9afd5..0000000000 --- a/test/files/scalacheck/t4147.scala +++ /dev/null @@ -1,68 +0,0 @@ -import org.scalacheck.Prop.{forAll, throws} -import org.scalacheck.Properties -import org.scalacheck.Gen - - -import collection.mutable - - -object Test extends Properties("Mutable TreeSet") { - - val generator = Gen.listOfN(1000, Gen.chooseNum(0, 1000)) - - val denseGenerator = Gen.listOfN(1000, Gen.chooseNum(0, 200)) - - property("Insertion doesn't allow duplicates values.") = forAll(generator) { (s: List[Int]) => - { - val t = mutable.TreeSet[Int](s: _*) - t == s.toSet - } - } - - property("Verification of size method validity") = forAll(generator) { (s: List[Int]) => - { - val t = mutable.TreeSet[Int](s: _*) - for (a <- s) { - t -= a - } - t.size == 0 - } - } - - property("All inserted elements are removed") = forAll(generator) { (s: List[Int]) => - { - val t = mutable.TreeSet[Int](s: _*) - for (a <- s) { - t -= a - } - t == Set() - } - } - - property("Elements are sorted.") = forAll(generator) { (s: List[Int]) => - { - val t = mutable.TreeSet[Int](s: _*) - t.toList == s.distinct.sorted - } - } - - property("Implicit CanBuildFrom resolution succeeds as well as the \"same-result-type\" principle.") = - forAll(generator) { (s: List[Int]) => - { - val t = mutable.TreeSet[Int](s: _*) - val t2 = t.map(_ * 2) - t2.isInstanceOf[collection.mutable.TreeSet[Int]] - } - } - - property("A view doesn't expose off bounds elements") = forAll(denseGenerator) { (s: List[Int]) => - { - val t = mutable.TreeSet[Int](s: _*) - val view = t.rangeImpl(Some(50), Some(150)) - view.filter(_ < 50) == Set[Int]() && view.filter(_ >= 150) == Set[Int]() - } - } - - property("ordering must not be null") = - throws(classOf[NullPointerException])(mutable.TreeSet.empty[Int](null)) -} diff --git a/test/files/scalacheck/test.scala b/test/files/scalacheck/test.scala deleted file mode 100644 index f69c7fe211..0000000000 --- a/test/files/scalacheck/test.scala +++ /dev/null @@ -1,8 +0,0 @@ -import org.scalacheck._ - - - - - - -object Test extends Properties("Nothing") diff --git a/test/files/scalacheck/testdir/dep.scala b/test/files/scalacheck/testdir/dep.scala deleted file mode 100644 index ab167cbc8b..0000000000 --- a/test/files/scalacheck/testdir/dep.scala +++ /dev/null @@ -1,7 +0,0 @@ - - - - -object Dependency { - val v = 1 -} diff --git a/test/files/scalacheck/testdir/test.scala b/test/files/scalacheck/testdir/test.scala deleted file mode 100644 index d5a5056137..0000000000 --- a/test/files/scalacheck/testdir/test.scala +++ /dev/null @@ -1,10 +0,0 @@ -import org.scalacheck._ - - - - - - -object Test extends Properties("Nothing") { - val d = Dependency.v -} diff --git a/test/files/scalacheck/treemap.scala b/test/files/scalacheck/treemap.scala deleted file mode 100644 index f672637c57..0000000000 --- a/test/files/scalacheck/treemap.scala +++ /dev/null @@ -1,154 +0,0 @@ -import collection.immutable._ -import org.scalacheck._ -import Prop._ -import Gen._ -import Arbitrary._ -import util._ -import Buildable._ - -object Test extends Properties("TreeMap") { - def genTreeMap[A: Arbitrary: Ordering, B: Arbitrary]: Gen[TreeMap[A, B]] = - for { - keys <- listOf(arbitrary[A]) - values <- listOfN(keys.size, arbitrary[B]) - } yield TreeMap(keys zip values: _*) - implicit def arbTreeMap[A : Arbitrary : Ordering, B : Arbitrary] = Arbitrary(genTreeMap[A, B]) - - property("foreach/iterator consistency") = forAll { (subject: TreeMap[Int, String]) => - val it = subject.iterator - var consistent = true - subject.foreach { element => - consistent &&= it.hasNext && element == it.next - } - consistent - } - - property("worst-case tree height is iterable") = forAll(choose(0, 10), arbitrary[Boolean]) { (n: Int, even: Boolean) => - /* - * According to "Ralf Hinze. Constructing red-black trees" [http://www.cs.ox.ac.uk/ralf.hinze/publications/#P5] - * you can construct a skinny tree of height 2n by inserting the elements [1 .. 2^(n+1) - 2] and a tree of height - * 2n+1 by inserting the elements [1 .. 3 * 2^n - 2], both in reverse order. - * - * Since we allocate a fixed size buffer in the iterator (based on the tree size) we need to ensure - * it is big enough for these worst-case trees. - */ - val highest = if (even) (1 << (n+1)) - 2 else 3*(1 << n) - 2 - val values = (1 to highest).reverse - val subject = TreeMap(values zip values: _*) - val it = subject.iterator - try { while (it.hasNext) it.next; true } catch { case _ => false } - } - - property("sorted") = forAll { (subject: TreeMap[Int, String]) => (subject.size >= 3) ==> { - subject.zip(subject.tail).forall { case (x, y) => x._1 < y._1 } - }} - - property("contains all") = forAll { (arr: List[(Int, String)]) => - val subject = TreeMap(arr: _*) - arr.map(_._1).forall(subject.contains(_)) - } - - property("size") = forAll { (elements: List[(Int, Int)]) => - val subject = TreeMap(elements: _*) - elements.map(_._1).distinct.size == subject.size - } - - property("toSeq") = forAll { (elements: List[(Int, Int)]) => - val subject = TreeMap(elements: _*) - elements.map(_._1).distinct.sorted == subject.toSeq.map(_._1) - } - - property("head") = forAll { (elements: List[Int]) => elements.nonEmpty ==> { - val subject = TreeMap(elements zip elements: _*) - elements.min == subject.head._1 - }} - - property("last") = forAll { (elements: List[Int]) => elements.nonEmpty ==> { - val subject = TreeMap(elements zip elements: _*) - elements.max == subject.last._1 - }} - - property("head/tail identity") = forAll { (subject: TreeMap[Int, String]) => subject.nonEmpty ==> { - subject == (subject.tail + subject.head) - }} - - property("init/last identity") = forAll { (subject: TreeMap[Int, String]) => subject.nonEmpty ==> { - subject == (subject.init + subject.last) - }} - - property("take") = forAll { (subject: TreeMap[Int, String]) => - val n = choose(0, subject.size).sample.get - n == subject.take(n).size && subject.take(n).forall(elt => subject.get(elt._1) == Some(elt._2)) - } - - property("drop") = forAll { (subject: TreeMap[Int, String]) => - val n = choose(0, subject.size).sample.get - (subject.size - n) == subject.drop(n).size && subject.drop(n).forall(elt => subject.get(elt._1) == Some(elt._2)) - } - - property("take/drop identity") = forAll { (subject: TreeMap[Int, String]) => - val n = choose(-1, subject.size + 1).sample.get - subject == subject.take(n) ++ subject.drop(n) - } - - property("splitAt") = forAll { (subject: TreeMap[Int, String]) => - val n = choose(-1, subject.size + 1).sample.get - val (prefix, suffix) = subject.splitAt(n) - prefix == subject.take(n) && suffix == subject.drop(n) - } - - def genSliceParms = for { - tree <- genTreeMap[Int, String] - from <- choose(0, tree.size) - until <- choose(from, tree.size) - } yield (tree, from, until) - - property("slice") = forAll(genSliceParms) { case (subject, from, until) => - val slice = subject.slice(from, until) - slice.size == until - from && subject.toSeq == subject.take(from).toSeq ++ slice ++ subject.drop(until) - } - - property("takeWhile") = forAll { (subject: TreeMap[Int, String]) => - val result = subject.takeWhile(_._1 < 0) - result.forall(_._1 < 0) && result == subject.take(result.size) - } - - property("dropWhile") = forAll { (subject: TreeMap[Int, String]) => - val result = subject.dropWhile(_._1 < 0) - result.forall(_._1 >= 0) && result == subject.takeRight(result.size) - } - - property("span identity") = forAll { (subject: TreeMap[Int, String]) => - val (prefix, suffix) = subject.span(_._1 < 0) - prefix.forall(_._1 < 0) && suffix.forall(_._1 >= 0) && subject == prefix ++ suffix - } - - property("from is inclusive") = forAll { (subject: TreeMap[Int, String]) => subject.nonEmpty ==> { - val n = choose(0, subject.size - 1).sample.get - val from = subject.drop(n).firstKey - subject.from(from).firstKey == from && subject.from(from).forall(_._1 >= from) - }} - - property("to is inclusive") = forAll { (subject: TreeMap[Int, String]) => subject.nonEmpty ==> { - val n = choose(0, subject.size - 1).sample.get - val to = subject.drop(n).firstKey - subject.to(to).lastKey == to && subject.to(to).forall(_._1 <= to) - }} - - property("until is exclusive") = forAll { (subject: TreeMap[Int, String]) => subject.size > 1 ==> { - val n = choose(1, subject.size - 1).sample.get - val until = subject.drop(n).firstKey - subject.until(until).lastKey == subject.take(n).lastKey && subject.until(until).forall(_._1 <= until) - }} - - property("remove single") = forAll { (subject: TreeMap[Int, String]) => subject.nonEmpty ==> { - val key = oneOf(subject.keys.toSeq).sample.get - val removed = subject - key - subject.contains(key) && !removed.contains(key) && subject.size - 1 == removed.size - }} - - property("remove all") = forAll { (subject: TreeMap[Int, String]) => - val result = subject.foldLeft(subject)((acc, elt) => acc - elt._1) - result.isEmpty - } -} diff --git a/test/files/scalacheck/treeset.scala b/test/files/scalacheck/treeset.scala deleted file mode 100644 index 4b9b77dd7e..0000000000 --- a/test/files/scalacheck/treeset.scala +++ /dev/null @@ -1,155 +0,0 @@ -import collection.immutable._ -import org.scalacheck._ -import Prop._ -import Gen._ -import Arbitrary._ -import util._ - -object Test extends Properties("TreeSet") { - def genTreeSet[A: Arbitrary: Ordering]: Gen[TreeSet[A]] = - for { - elements <- listOf(arbitrary[A]) - } yield TreeSet(elements: _*) - implicit def arbTreeSet[A : Arbitrary : Ordering]: Arbitrary[TreeSet[A]] = Arbitrary(genTreeSet) - - property("foreach/iterator consistency") = forAll { (subject: TreeSet[Int]) => - val it = subject.iterator - var consistent = true - subject.foreach { element => - consistent &&= it.hasNext && element == it.next - } - consistent - } - - property("worst-case tree height is iterable") = forAll(choose(0, 10), arbitrary[Boolean]) { (n: Int, even: Boolean) => - /* - * According to "Ralf Hinze. Constructing red-black trees" [http://www.cs.ox.ac.uk/ralf.hinze/publications/#P5] - * you can construct a skinny tree of height 2n by inserting the elements [1 .. 2^(n+1) - 2] and a tree of height - * 2n+1 by inserting the elements [1 .. 3 * 2^n - 2], both in reverse order. - * - * Since we allocate a fixed size buffer in the iterator (based on the tree size) we need to ensure - * it is big enough for these worst-case trees. - */ - val highest = if (even) (1 << (n+1)) - 2 else 3*(1 << n) - 2 - val values = (1 to highest).reverse - val subject = TreeSet(values: _*) - val it = subject.iterator - try { while (it.hasNext) it.next; true } catch { case _ => false } - } - - property("sorted") = forAll { (subject: TreeSet[Int]) => (subject.size >= 3) ==> { - subject.zip(subject.tail).forall { case (x, y) => x < y } - }} - - property("contains all") = forAll { (elements: List[Int]) => - val subject = TreeSet(elements: _*) - elements.forall(subject.contains) - } - - property("size") = forAll { (elements: List[Int]) => - val subject = TreeSet(elements: _*) - elements.distinct.size == subject.size - } - - property("toSeq") = forAll { (elements: List[Int]) => - val subject = TreeSet(elements: _*) - elements.distinct.sorted == subject.toSeq - } - - property("head") = forAll { (elements: List[Int]) => elements.nonEmpty ==> { - val subject = TreeSet(elements: _*) - elements.min == subject.head - }} - - property("last") = forAll { (elements: List[Int]) => elements.nonEmpty ==> { - val subject = TreeSet(elements: _*) - elements.max == subject.last - }} - - property("head/tail identity") = forAll { (subject: TreeSet[Int]) => subject.nonEmpty ==> { - subject == (subject.tail + subject.head) - }} - - property("init/last identity") = forAll { (subject: TreeSet[Int]) => subject.nonEmpty ==> { - subject == (subject.init + subject.last) - }} - - property("take") = forAll { (subject: TreeSet[Int]) => - val n = choose(0, subject.size).sample.get - n == subject.take(n).size && subject.take(n).forall(subject.contains) - } - - property("drop") = forAll { (subject: TreeSet[Int]) => - val n = choose(0, subject.size).sample.get - (subject.size - n) == subject.drop(n).size && subject.drop(n).forall(subject.contains) - } - - property("take/drop identity") = forAll { (subject: TreeSet[Int]) => - val n = choose(-1, subject.size + 1).sample.get - subject == subject.take(n) ++ subject.drop(n) - } - - property("splitAt") = forAll { (subject: TreeSet[Int]) => - val n = choose(-1, subject.size + 1).sample.get - val (prefix, suffix) = subject.splitAt(n) - prefix == subject.take(n) && suffix == subject.drop(n) - } - - def genSliceParms = for { - tree <- genTreeSet[Int] - from <- choose(0, tree.size) - until <- choose(from, tree.size) - } yield (tree, from, until) - - property("slice") = forAll(genSliceParms) { case (subject, from, until) => - val slice = subject.slice(from, until) - slice.size == until - from && subject.toSeq == subject.take(from).toSeq ++ slice ++ subject.drop(until) - } - - property("takeWhile") = forAll { (subject: TreeSet[Int]) => - val result = subject.takeWhile(_ < 0) - result.forall(_ < 0) && result == subject.take(result.size) - } - - property("dropWhile") = forAll { (subject: TreeSet[Int]) => - val result = subject.dropWhile(_ < 0) - result.forall(_ >= 0) && result == subject.takeRight(result.size) - } - - property("span identity") = forAll { (subject: TreeSet[Int]) => - val (prefix, suffix) = subject.span(_ < 0) - prefix.forall(_ < 0) && suffix.forall(_ >= 0) && subject == prefix ++ suffix - } - - property("from is inclusive") = forAll { (subject: TreeSet[Int]) => subject.nonEmpty ==> { - val n = choose(0, subject.size - 1).sample.get - val from = subject.drop(n).firstKey - subject.from(from).firstKey == from && subject.from(from).forall(_ >= from) - }} - - property("to is inclusive") = forAll { (subject: TreeSet[Int]) => subject.nonEmpty ==> { - val n = choose(0, subject.size - 1).sample.get - val to = subject.drop(n).firstKey - subject.to(to).lastKey == to && subject.to(to).forall(_ <= to) - }} - - property("until is exclusive") = forAll { (subject: TreeSet[Int]) => subject.size > 1 ==> { - val n = choose(1, subject.size - 1).sample.get - val until = subject.drop(n).firstKey - subject.until(until).lastKey == subject.take(n).lastKey && subject.until(until).forall(_ <= until) - }} - - property("remove single") = forAll { (subject: TreeSet[Int]) => subject.nonEmpty ==> { - val element = oneOf(subject.toSeq).sample.get - val removed = subject - element - subject.contains(element) && !removed.contains(element) && subject.size - 1 == removed.size - }} - - property("remove all") = forAll { (subject: TreeSet[Int]) => - val result = subject.foldLeft(subject)((acc, elt) => acc - elt) - result.isEmpty - } - - property("ordering must not be null") = - throws(classOf[NullPointerException])(TreeSet.empty[Int](null)) -} |