📄 test_expr.in
字号:
# -*- sh -*-# $ProjectHeader: use 2-3-0-release.1 Mon, 12 Sep 2005 20:18:33 +0200 green $## This file is for testing parsing and evaluation of expressions. Each# expression may span multiple lines. They must be followed by a line# prefixed with '->' containing the expected result. Comment lines# starting with a double hash ('##') are printed out during testing.### Basic literals#42-> 42 : Integer3.1-> 3.1 : Real-5-> -5 : Integertrue-> true : Booleanfalse-> false : Boolean'aString'-> 'aString' : String''-> '' : String### Operations on Integers and Reals#3-(8+4)*(4+5)-> -105 : Integer-(3-(8+4)*(4+5))-> 105 : Integer- - -(3-(8+4)*(4+5))-> 105 : Integer3 / 0-> Undefined : Real3 div 0-> Undefined : Integer10.mod(3)-> 1 : Integer3 / 1.5-> 2.0 : Real3.0 / 2-> 1.5 : Real3.min(4)-> 3 : Integer3.max(4)-> 4 : Integer3.abs-> 3 : Integer3.abs + 4-> 7 : Integer3.9.floor-> 3 : Integer3.floor-> 3 : Integer3.9.round-> 4 : Integer3.round-> 3 : Integer3 < 4-> true : Boolean3.0 < 4-> true : Boolean3 < 4.0-> true : Boolean3 = 3.0-> true : Boolean### Operations on Booleans#true or false-> true : Booleanfalse implies true = not false or false-> true : Booleannot not false-> false : Boolean#FIXME:#true or Undefined#-> true : Boolean### Operations on Strings#'foo'.size-> 3 : Integer'foo'.concat('bar')-> 'foobar' : String# FIXME: add + operator for strings?#'foo' + 'bar'#-> 'foobar' : String'foO'.toUpper-> 'FOO' : String'fOO'.toLower-> 'foo' : String'foobar'.substring(2,4)-> 'oob' : String### If-then-else expressions#if true then 2 else 3 endif-> 2 : Integerif false then 2 else 3 endif-> 3 : Integer### Collection literals#Set{1, 2}-> Set{1,2} : Set(Integer)Set{1..3}-> Set{1,2,3} : Set(Integer)Set{1..2*2}-> Set{1,2,3,4} : Set(Integer)Set{1.3, 2.5}-> Set{1.3,2.5} : Set(Real)Set{'b','a'}-> Set{'a','b'} : Set(String)Set{1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9}-> Set{1,2,3,4,5,6,7,8,9} : Set(Integer)Set{Set{1}, Set{2}}-> Set{Set{1},Set{2}} : Set(Set(Integer))Set{Set{1}, Set{2}, Set{2}, Set{3}}-> Set{Set{1},Set{2},Set{3}} : Set(Set(Integer))Sequence{'a','b'}-> Sequence{'a','b'} : Sequence(String)Sequence{5..8}-> Sequence{5,6,7,8} : Sequence(Integer)Sequence{'a','b','a'}-> Sequence{'a','b','a'} : Sequence(String)Sequence{Set{1},Set{2,3}}-> Sequence{Set{1},Set{2,3}} : Sequence(Set(Integer))Bag{1,2,2,3}-> Bag{1,2,2,3} : Bag(Integer)Bag{Set{1}, Set{2}, Set{2}, Set{3}}-> Bag{Set{1},Set{2},Set{2},Set{3}} : Bag(Set(Integer))### Empty collections#oclEmpty(Set(Integer))-> Set{} : Set(Integer)oclEmpty(Set(Set(Integer)))-> Set{} : Set(Set(Integer))### Query expressions#Set{1,2,3}->select(true)-> Set{1,2,3} : Set(Integer)Set{1,2,3}->select(e : Integer | e > 1)-> Set{2,3} : Set(Integer)Set{1,2,3}->select(e | e > 1)-> Set{2,3} : Set(Integer)### Iterate Expressions#Set{1,2,3,4,5,6}->iterate(e : Integer; acc : Integer = 0 | acc + e)-> 21 : IntegerSequence{3,2,1}->iterate(e : Integer; acc : Integer = 6 | acc - e)-> 0 : IntegerBag{1,2,2,3}->iterate(e : Integer; acc : Integer = 0 | acc + e)-> 8 : IntegerSet{Set{1,2},Set{2,3,4}}->iterate(e : Set(Integer); acc : Set(String) = Set{'a'} | Set{'b'})-> Set{'b'} : Set(String)Set{Set{1,2},Set{3},Set{2,3,4}}->iterate(e : Set(Integer); acc : Set(Integer) = Set{0} | acc->union(e))-> Set{0,1,2,3,4} : Set(Integer)Sequence{1,2,3}->iterate( e1, e2 : Integer; res : Integer = 0 | res + e1 * e2)-> 36 : Integer### Set operations#Set{1,2,3}->size()-> 3 : IntegerSet{1,2,3}->union(Set{0,2,4})-> Set{0,1,2,3,4} : Set(Integer)Set{1,2}->union(Set{1,2})-> Set{1,2} : Set(Integer)Set{1,2}->union(Bag{1,2,3})-> Bag{1,1,2,2,3} : Bag(Integer)Set{1,2,3}->intersection(Set{1,2})-> Set{1,2} : Set(Integer)Set{1,2,3}->intersection(Set{4})-> Set{} : Set(Integer)Set{1,2,3} - Set{2}-> Set{1,3} : Set(Integer)Set{1,2,3}->symmetricDifference(Set{2,4})-> Set{1,3,4} : Set(Integer)Set{1,2,3}->including(5)-> Set{1,2,3,5} : Set(Integer)Set{1,2,3}->including(1)-> Set{1,2,3} : Set(Integer)Set{1,2,3}->excluding(5)-> Set{1,2,3} : Set(Integer)Set{1,2,3}->excluding(1)-> Set{2,3} : Set(Integer)Set{1,2,3}->select(e | e > 1)-> Set{2,3} : Set(Integer)Set{1,2,3}->select(e | e <> 2)-> Set{1,3} : Set(Integer)Set{Set{1,2},Set{2,3,4}}->select(s | s->size > 2)-> Set{Set{2,3,4}} : Set(Set(Integer))Set{Set{2},Set{1,2},Set{2,3,4}}->select(s | s->size.mod(2) = 1)-> Set{Set{2},Set{2,3,4}} : Set(Set(Integer))Set{Set{2},Set{1,2},Set{2,3,4}}->select(s | s->size.mod(2) = 1)->size()-> 2 : IntegerSet{1,2,3}->reject(e | e > 1)-> Set{1} : Set(Integer)Set{1,2,3}->reject(e | e <> 2)-> Set{2} : Set(Integer)Set{1,2,3}->collect(e | e * 2)-> Bag{2,4,6} : Bag(Integer)Set{1,2,3}->collect(1)-> Bag{1,1,1} : Bag(Integer)Set{1,2,3}->collect(e | 'abc'.substring(e,3))-> Bag{'abc','bc','c'} : Bag(String)### Sequence operations#Sequence{1,2,3}->at(1)-> 1 : IntegerSequence{1,2,3}->at(2)-> 2 : IntegerSequence{1,2,3}->at(3)-> 3 : IntegerSequence{1,2,3}->at(1) = 1 and Sequence{1,2,3}->at(2) = 2 and Sequence{1,2,3}->at(3) = 3-> true : BooleanSequence{1,2,2,3}->asSet-> Set{1,2,3} : Set(Integer)### Bag operations#Bag{1,2}->union(Bag{1,2,3})-> Bag{1,1,2,2,3} : Bag(Integer)Bag{1,2,2,3}->asSet-> Set{1,2,3} : Set(Integer)Bag{Set{1}, Set{2}, Set{2}, Set{3}}->asSet-> Set{Set{1},Set{2},Set{3}} : Set(Set(Integer))### Flattening#Bag{Set{1}, Set{2}, Set{2}, Set{3}}->flatten-> Bag{1,2,2,3} : Bag(Integer)Bag{Bag{1,1}, Bag{2,1}, Bag{1,2,3}}->flatten-> Bag{1,1,1,1,2,2,3} : Bag(Integer)Bag{Sequence{1,2}, Sequence{2,1}, Sequence{2,3}}->flatten-> Bag{1,1,2,2,2,3} : Bag(Integer)Set{Set{1}, Set{2}, Set{2}, Set{3}}->flatten-> Set{1,2,3} : Set(Integer)Set{Bag{1,1}, Bag{2,1}, Bag{1,2,3}}->flatten-> Set{1,2,3} : Set(Integer)Set{Sequence{1,2}, Sequence{2,1}, Sequence{2,3}}->flatten-> Set{1,2,3} : Set(Integer)Sequence{Sequence{1,2}, Sequence{2,1}, Sequence{2,3}}->flatten-> Sequence{1,2,2,1,2,3} : Sequence(Integer)### Exists and forAll on collections#Set{1,2,3,4,5,6}->exists(e | e > 0)-> true : BooleanSet{1,2,3,4,5,6}->exists(e | e = 7)-> false : BooleanSet{1,2,3,4,5,6}->forAll(e | e > 0)-> true : BooleanSet{1,2,3,4,5,6}->forAll(e | e > 1)-> false : BooleanSequence{1,2,3,4,5,6}->exists(e | e > 0)-> true : BooleanSequence{1,2,3,4,5,6}->exists(e | e = 7)-> false : BooleanSequence{1,2,3,4,5,6}->forAll(e | e > 0)-> true : BooleanSequence{1,2,3,4,5,6}->forAll(e | e > 1)-> false : BooleanBag{1,2,3,4,5,6}->exists(e | e > 0)-> true : BooleanBag{1,2,3,4,5,6}->exists(e | e = 7)-> false : BooleanBag{1,2,3,4,5,6}->forAll(e | e > 0)-> true : BooleanBag{1,2,3,4,5,6}->forAll(e | e > 1)-> false : Boolean### Nested Iterate Expressions#Set{Set{1,2},Set{2,3,4}}->iterate( e1 : Set(Integer); acc1 : Integer = 0 | e1->iterate( e2 : Integer; acc2 : Integer = 0 | acc2 + e2) + acc1)-> 12 : Integer### Cartesian Product# FIXME: need empty set literal: e.g. Set(Sequence(Integer)).newSet{1,2,3}->iterate( e1 : Integer; s : Set(Sequence(Integer)) = Set{Sequence{1,4}} | s->union(Set{4,5,6}->iterate( e2 : Integer; s2 : Set(Sequence(Integer)) = Set{Sequence{1,4}} | s2->including(Sequence{e1, e2}))))-> Set{Sequence{1,4},Sequence{1,5},Sequence{1,6},Sequence{2,4},Sequence{2,5},Sequence{2,6},Sequence{3,4},Sequence{3,5},Sequence{3,6}} : Set(Sequence(Integer))### Transitive Closure (Warshall's algorithm)## M = Set{1,2,3} # Relation R subseteq M x M = Set{Sequence{1,2}, Sequence{2,3}}# Result R* = Set{Sequence{1,2},Sequence{1,3},Sequence{2,3}}Set{1,2,3}->iterate( e3 : Integer; s3 : Set(Sequence(Integer)) = Set{Sequence{1,2}, Sequence{2,3}} | Set{1,2,3}->iterate( e2 : Integer; s2 : Set(Sequence(Integer)) = s3 | Set{1,2,3}->iterate( e1 : Integer; s1 : Set(Sequence(Integer)) = s2 | if s1->exists(p1 : Sequence(Integer) | s1->exists(p2 : Sequence(Integer) | (p1->at(1) = e1 and p1->at(2) = e2) or (p1->at(1) = e1 and p1->at(2) = e3 and p2->at(1) = e3 and p2->at(2) = e2) )) then s1->including(Sequence{e1,e2}) else s1 endif)))-> Set{Sequence{1,2},Sequence{1,3},Sequence{2,3}} : Set(Sequence(Integer))Set{1,2,3,4}->iterate( e3 : Integer; s3 : Set(Sequence(Integer)) = Set{Sequence{1,2}, Sequence{2,3}, Sequence{3,4}} | Set{1,2,3,4}->iterate( e2 : Integer; s2 : Set(Sequence(Integer)) = s3 | Set{1,2,3,4}->iterate( e1 : Integer; s1 : Set(Sequence(Integer)) = s2 | if s1->exists(p1 : Sequence(Integer) | s1->exists(p2 : Sequence(Integer) | (p1->at(1) = e1 and p1->at(2) = e2) or (p1->at(1) = e1 and p1->at(2) = e3 and p2->at(1) = e3 and p2->at(2) = e2) )) then s1->including(Sequence{e1,e2}) else s1 endif)))->size()-> 6 : Integer### Sorting a sequence#Sequence{2,4,6,3}->iterate( e1 : Integer; res1 : Sequence(Integer) = Sequence{1}->select(false) | if res1->isEmpty then Sequence{e1} else if res1->last <= e1 then res1->append(e1) else res1->iterate( e2 : Integer; res2 : Sequence(Integer) = Sequence{1}->select(false) | if e1 < e2 and res2->forAll(e3:Integer | e1 >= e3 ) then res2->append(e1)->append(e2) else res2->append(e2) endif ) endif endif )-> Sequence{2,3,4,6} : Sequence(Integer)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -