| 1 | (******************************************************************************* |
|---|
| 2 | Copyright 2009 Sun Microsystems, Inc., |
|---|
| 3 | 4150 Network Circle, Santa Clara, California 95054, U.S.A. |
|---|
| 4 | All rights reserved. |
|---|
| 5 | |
|---|
| 6 | U.S. Government Rights - Commercial software. |
|---|
| 7 | Government users are subject to the Sun Microsystems, Inc. standard |
|---|
| 8 | license agreement and applicable provisions of the FAR and its supplements. |
|---|
| 9 | |
|---|
| 10 | Use is subject to license terms. |
|---|
| 11 | |
|---|
| 12 | This distribution may include materials developed by third parties. |
|---|
| 13 | |
|---|
| 14 | Sun, Sun Microsystems, the Sun logo and Java are trademarks or registered |
|---|
| 15 | trademarks of Sun Microsystems, Inc. in the U.S. and other countries. |
|---|
| 16 | ******************************************************************************) |
|---|
| 17 | |
|---|
| 18 | component asifTest |
|---|
| 19 | import List.{...} |
|---|
| 20 | export Executable |
|---|
| 21 | |
|---|
| 22 | (* For still-not-working cases involving self parameters, see |
|---|
| 23 | commented-out code below, and non-commented version in |
|---|
| 24 | not_passing_yet/asifSelf.fss; also see bug #63. *) |
|---|
| 25 | |
|---|
| 26 | propAsif[\T extends Foo\](x:T, y:T): Boolean = |
|---|
| 27 | (x = (y asif T)) |
|---|
| 28 | |
|---|
| 29 | trait Quux |
|---|
| 30 | passQuux(): Boolean = true |
|---|
| 31 | end |
|---|
| 32 | |
|---|
| 33 | trait Foo extends { Quux, Equality[\Foo\] } |
|---|
| 34 | passFoo(): Boolean = true |
|---|
| 35 | passBar(): Boolean = false |
|---|
| 36 | opr =(self, x:Foo): Boolean = false |
|---|
| 37 | end |
|---|
| 38 | |
|---|
| 39 | object Bar extends Foo |
|---|
| 40 | getter asString(): String = "Bar" |
|---|
| 41 | passFoo(): Boolean = false |
|---|
| 42 | passBar(): Boolean = true |
|---|
| 43 | passQuux(): Boolean = false |
|---|
| 44 | opr =(self, x:Bar): Boolean = true |
|---|
| 45 | end |
|---|
| 46 | |
|---|
| 47 | object Baz extends Foo |
|---|
| 48 | getter asString(): String = "Baz" |
|---|
| 49 | passFoo(): Boolean = false |
|---|
| 50 | passQuux(): Boolean = false |
|---|
| 51 | opr =(self, x:Baz): Boolean = true |
|---|
| 52 | end |
|---|
| 53 | |
|---|
| 54 | opr EEK(x:Foo, y:Foo): Boolean = false |
|---|
| 55 | opr EEK(x:Bar, y:Bar): Boolean = true |
|---|
| 56 | opr EEK(x:Baz, y:Baz): Boolean = true |
|---|
| 57 | opr NEEK(x:Foo, y:Foo): Boolean = NOT (x EEK y) |
|---|
| 58 | |
|---|
| 59 | run():() = do |
|---|
| 60 | (* Generic non-overloaded function *) |
|---|
| 61 | x : List[\Foo\] = <| Bar asif Foo, Bar, Bar |> |
|---|
| 62 | y : List[\Foo\] = <| Baz asif Foo, Baz |> |
|---|
| 63 | (* Now appending the two ought to work. *) |
|---|
| 64 | println(x || y) |
|---|
| 65 | |
|---|
| 66 | (* Top-level overloading *) |
|---|
| 67 | a : List[\RR64\] = <| 1.0 asif RR64, 2.0, 3.0, 4.0 |> |
|---|
| 68 | assert(a,<|1 asif RR64,2,3,4|>," lists ought to compare at RR64") |
|---|
| 69 | |
|---|
| 70 | assert(Bar EEK Bar, true, " Bar unequal") |
|---|
| 71 | assert(Baz EEK Baz, true, " Baz unequal") |
|---|
| 72 | assert(Bar EEK Baz, false, " Bar EEK Baz") |
|---|
| 73 | assert(Baz EEK Bar, false, " Baz EEK Bar") |
|---|
| 74 | assert((Bar asif Foo) EEK Bar, false, " Foo EEK Bar") |
|---|
| 75 | assert(Bar EEK (Bar asif Foo), false, " Bar EEK Foo") |
|---|
| 76 | assert((Bar asif Foo) EEK (Bar asif Foo), false, " Foo EEK Foo") |
|---|
| 77 | assert((Bar asif Foo) NEEK (Bar asif Foo), false, |
|---|
| 78 | " Bar NEEK Bar failed to strip an asif!") |
|---|
| 79 | |
|---|
| 80 | (* Functional method *) |
|---|
| 81 | assert(Bar = Bar, true, " Bar unequal") |
|---|
| 82 | assert(Baz = Baz, true, " Baz unequal") |
|---|
| 83 | assert(Bar = Baz, false, " Bar=Baz") |
|---|
| 84 | assert(Baz = Bar, false, " Baz=Bar") |
|---|
| 85 | assert(Bar = (Bar asif Foo), false, " Bar = Foo") |
|---|
| 86 | assert(Bar =/= (Bar asif Foo), false, " Bar =/= Bar failed to strip asif!") |
|---|
| 87 | assert((Bar asif Foo) = (Baz asif Foo), false, " Foo = Foo") |
|---|
| 88 | assert((Bar asif Foo) =/= Bar, false, |
|---|
| 89 | " Foo=/=Foo failed to strip an asif!") |
|---|
| 90 | assert((Bar asif Foo) = Bar, false, " Foo = Bar") |
|---|
| 91 | |
|---|
| 92 | (* Dotted method *) |
|---|
| 93 | assert(Bar.passBar(), true, "NOT Bar.passBar()") |
|---|
| 94 | assert(Baz.passBar(), false, "Baz.passBar()") |
|---|
| 95 | assert(Bar.passFoo(), false, "Bar.passFoo()") |
|---|
| 96 | assert(Bar.passQuux(), false, "Bar.passQuux()") |
|---|
| 97 | assert((Bar asif Foo).passFoo(), true, "NOT Foo.passFoo()") |
|---|
| 98 | assert((Bar asif Foo).passBar(), false, "NOT Foo.passFoo()") |
|---|
| 99 | assert((Bar asif Foo).passQuux(), true, "NOT Bar.passQuux()") |
|---|
| 100 | |
|---|
| 101 | (* Propagation *) |
|---|
| 102 | assert(propAsif(Bar, Bar), true, "NOT propAsif(Bar,Bar)") |
|---|
| 103 | assert(propAsif(Baz, Bar), false, "propAsif(Baz,Bar)") |
|---|
| 104 | assert(propAsif(Bar asif Foo, Bar), false, "propAsif(Foo,Bar)") |
|---|
| 105 | assert(propAsif(Bar, Bar asif Foo), false, "propAsif(Bar,Foo)") |
|---|
| 106 | |
|---|
| 107 | (* Mixed generic and overloaded method, at supertype. *) |
|---|
| 108 | typecase z = (3 asif RR64) + 17 of |
|---|
| 109 | ZZ64 => println("FAIL, got ZZ64 " z) |
|---|
| 110 | RR64 => println("PASS, got RR64 " z) |
|---|
| 111 | else => println("Got unknown typed " z) |
|---|
| 112 | end |
|---|
| 113 | |
|---|
| 114 | (* Comprehension |
|---|
| 115 | b : List[\Foo\] = <| Bar asif Foo | _ <- 0#3 |> |
|---|
| 116 | println(b) |
|---|
| 117 | assert(b,x," ought to compare at Foo") |
|---|
| 118 | *) |
|---|
| 119 | end |
|---|
| 120 | |
|---|
| 121 | end |
|---|