summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-01-15 21:48:47 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-01-16 11:36:49 +1000
commit09ce5c32f1db71ccaa5d4b22076d9ec606ad5ec9 (patch)
treed7188ff810f1d9a2cc6eb2faad18ebd40a0ac587 /test
parent05612399f78f34cb01fb31070eacf4a51b489dfb (diff)
downloadscala-09ce5c32f1db71ccaa5d4b22076d9ec606ad5ec9.tar.gz
scala-09ce5c32f1db71ccaa5d4b22076d9ec606ad5ec9.tar.bz2
scala-09ce5c32f1db71ccaa5d4b22076d9ec606ad5ec9.zip
SI-6502 More robust REPL :require
- handle missing files gracefully (rather than NPE) - read the class name with ASM, rather than with a dummy classloader. The dummy classloader is prone to throwing `LinkageError`s, as reported in the comments of SI-6502. Manual test of the original report: ``` % qscala Welcome to Scala version 2.11.5-20150115-183424-155dbf3fdf (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_25). Type in expressions to have them evaluated. Type :help for more information. scala> :require does/not/exist Cannot read: does/not/exist scala> classOf[org.junit.Test] <console>:8: error: object junit is not a member of package org classOf[org.junit.Test] ^ scala> :require /Users/jason/.m2/repository/junit/junit/4.11/junit-4.11.jar Added '/Users/jason/.m2/repository/junit/junit/4.11/junit-4.11.jar' to classpath. scala> classOf[org.junit.Test] res1: Class[org.junit.Test] = interface org.junit.Test ``` I have commited an automated test that is a minimization of this one.
Diffstat (limited to 'test')
-rw-r--r--test/files/run/t6502.scala26
1 files changed, 26 insertions, 0 deletions
diff --git a/test/files/run/t6502.scala b/test/files/run/t6502.scala
index 4ce034a482..b0d93ac3fd 100644
--- a/test/files/run/t6502.scala
+++ b/test/files/run/t6502.scala
@@ -46,6 +46,12 @@ object Test extends StoreReporterDirectTest {
}
}"""
+ def app6 = """
+ package test6
+ class A extends Test { println("created test6.A") }
+ class Z extends Test { println("created test6.Z") }
+ trait Test"""
+
def test1(): Unit = {
val jar = "test1.jar"
compileCode(app1, jar)
@@ -105,11 +111,31 @@ object Test extends StoreReporterDirectTest {
println(s"test4 res2: $res2")
}
+ def test5(): Unit = {
+ val codeToRun = ":require /does/not/exist.jar"
+ val output = ILoop.run(codeToRun, settings)
+ assert(!output.contains("NullPointerException"), output)
+ assert(output.contains("Cannot load '/does/not/exist.jar'"), output)
+ }
+
+ def test6(): Unit = {
+ // Avoid java.lang.NoClassDefFoundError triggered by the old appoach of using a Java
+ // classloader to parse .class files in order to read their names.
+ val jar = "test6.jar"
+ compileCode(app6, jar)
+ val codeToRun = toCodeInSeparateLines(s":require ${testOutput.path}/$jar", "import test6._; new A; new Z")
+ val output = ILoop.run(codeToRun, settings)
+ assert(output.contains("created test6.A"), output)
+ assert(output.contains("created test6.Z"), output)
+ }
+
def show(): Unit = {
test1()
test2()
test3()
test4()
+ test5()
+ test6()
}
def toCodeInSeparateLines(lines: String*): String = lines.map(_ + "\n").mkString