summaryrefslogblamecommitdiff
path: root/test/files/jvm/inner.scala
blob: 08dd4c4857ecfa4e484810caa47ab3e24574a066 (plain) (tree)
1
2
3
4
5
6
7
8
9


                                                                              
       
 
                                                                    

         
                   

                                        

                                            


             
                            

                            
                       



                    
                            



                                  

                        





                                             
                          


     

                                    















                                                                         
                                                                             


                                             
                                                                                  



































                                                                                
                                                                              



                                                                              
//############################################################################
// Test Java interaction with scala inner classes
//############################################################################
// $Id$

import java.io.{BufferedReader, File, FileWriter, InputStreamReader}

class A {
  val abc = "A.abc"

  protected class B(x: Int, y: String) {
    Console.println(abc); Console.println(x)
    Console.println(y)
  }

  trait Itf {
    def method1(x: Int): Int

    trait Itf2 extends Itf {
      def method2: Unit
    }
  }

  trait PlainTrait {
    def method1(x: Int): Int
  }

  class Impl(a: Int) extends Itf {
    def method1(x: Int) = {
      Console.println(x)
      Console.println(a)
      x + a
    }
  }

  class Impl2 extends Impl(1) with Itf#Itf2 {
    def method2 = {
      Console.println(abc)
    }
  }

  def newImpl: Itf = new Impl(1)
  def newImpl2: Itf#Itf2 = new Impl2

  class Outer1(arg1: Int) {
    class Outer2(arg2: Int) {
      class Outer3(arg3: Int) {
        Console.println("Outer3: " + arg1 + " " + arg2 + " " + arg3);
      }
    }
  }
}

object Scalatest {
  val outputdir = System.getProperty("scalatest.output", "inner-jvm.obj")
  val scalalib  = System.getProperty("scalatest.lib", "")
  val classpath = outputdir + File.pathSeparator + scalalib

  def javac(src: String) = {
    val tmpfilename = outputdir + File.separator + "tmpJavaInterraction.java"
    val tmpfile = new FileWriter(tmpfilename)
    tmpfile.write(src)
    tmpfile.close
    exec("javac -d " + outputdir + " -classpath " + classpath + " " + tmpfilename)
  }

  /** Execute cmd, wait for the process to end and pipe it's output to stdout */
  def exec(cmd: String) = {
    val proc = Runtime.getRuntime().exec(cmd);
    val inp = new BufferedReader(new InputStreamReader(proc.getInputStream))
    val errp = new BufferedReader(new InputStreamReader(proc.getErrorStream))
    proc.waitFor()
    while (inp.ready) Console.println(inp.readLine())
    while (errp.ready) Console.println(errp.readLine())
  }
}


object Test {
  val program = """
public class tmpJavaInterraction {

    public static void main(String[] args) {
        A a = new A();
        A.B b = a.new B(1, "Hello");

        A.Itf itf = a.newImpl();
        itf.method1(1);

        A.Itf.Itf2 itf2 = a.newImpl2();
        itf2.method2();

        A.Outer1 o1 = a.new Outer1(1);
        A.Outer1.Outer2 o2 = o1.new Outer2(2);
        A.Outer1.Outer2.Outer3 or = o2.new Outer3(3);
    }
}
"""
  def main(args: Array[String]): Unit = {
    Scalatest.javac(program)
    Scalatest.exec("java -cp " + Scalatest.classpath + " tmpJavaInterraction")
  }
}

//############################################################################