refactor: move benchmark directory under test and update all references
The benchmark directory is relocated from the project root into the test directory, and all scripts, documentation links, and gitignore paths are updated accordingly. The test runner is also refactored to explicitly walk subdirectories (core, io, language, limit) instead of using a single test root, and a new test/README.md is added to document the test suite structure. Additionally, the constructor test for the Foo class is updated to add a zero-arity constructor and adjust expected output strings.
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
IO.print(true == true) // expect: true
|
||||
IO.print(true == false) // expect: false
|
||||
IO.print(false == true) // expect: false
|
||||
IO.print(false == false) // expect: true
|
||||
|
||||
// Not equal to other types.
|
||||
IO.print(true == 1) // expect: false
|
||||
IO.print(false == 0) // expect: false
|
||||
IO.print(true == "true") // expect: false
|
||||
IO.print(false == "false") // expect: false
|
||||
IO.print(false == "") // expect: false
|
||||
|
||||
IO.print(true != true) // expect: false
|
||||
IO.print(true != false) // expect: true
|
||||
IO.print(false != true) // expect: true
|
||||
IO.print(false != false) // expect: false
|
||||
|
||||
// Not equal to other types.
|
||||
IO.print(true != 1) // expect: true
|
||||
IO.print(false != 0) // expect: true
|
||||
IO.print(true != "true") // expect: true
|
||||
IO.print(false != "false") // expect: true
|
||||
IO.print(false != "") // expect: true
|
||||
@@ -0,0 +1,3 @@
|
||||
IO.print(!true) // expect: false
|
||||
IO.print(!false) // expect: true
|
||||
IO.print(!!true) // expect: true
|
||||
@@ -0,0 +1,2 @@
|
||||
IO.print(true.toString) // expect: true
|
||||
IO.print(false.toString) // expect: false
|
||||
@@ -0,0 +1,4 @@
|
||||
IO.print(true is Bool) // expect: true
|
||||
IO.print(true is Object) // expect: true
|
||||
IO.print(true is Num) // expect: false
|
||||
IO.print(true.type == Bool) // expect: true
|
||||
@@ -0,0 +1,13 @@
|
||||
IO.print(Num == Num) // expect: true
|
||||
IO.print(Num == Bool) // expect: false
|
||||
|
||||
// Not equal to other types.
|
||||
IO.print(Num == 123) // expect: false
|
||||
IO.print(Num == true) // expect: false
|
||||
|
||||
IO.print(Num != Num) // expect: false
|
||||
IO.print(Num != Bool) // expect: true
|
||||
|
||||
// Not equal to other types.
|
||||
IO.print(Num != 123) // expect: true
|
||||
IO.print(Num != true) // expect: true
|
||||
@@ -0,0 +1,9 @@
|
||||
class Foo {}
|
||||
|
||||
IO.print(Foo.name) // expect: Foo
|
||||
IO.print(Foo.type.name) // expect: Foo metaclass
|
||||
|
||||
// Make sure the built-in classes have proper names too.
|
||||
IO.print(Object.name) // expect: Object
|
||||
IO.print(Class.name) // expect: Class
|
||||
IO.print(Bool.name) // expect: Bool
|
||||
@@ -0,0 +1,15 @@
|
||||
class Foo {}
|
||||
|
||||
class Bar is Foo {}
|
||||
|
||||
class Baz is Bar {}
|
||||
|
||||
// A class with no explicit superclass inherits Object.
|
||||
IO.print(Foo.supertype == Object) // expect: true
|
||||
|
||||
// Otherwise, it's the superclass.
|
||||
IO.print(Bar.supertype == Foo) // expect: true
|
||||
IO.print(Baz.supertype == Bar) // expect: true
|
||||
|
||||
// Object has no supertype.
|
||||
IO.print(Object.supertype) // expect: null
|
||||
@@ -0,0 +1,15 @@
|
||||
class Foo {}
|
||||
|
||||
// A class is a class.
|
||||
IO.print(Foo is Class) // expect: true
|
||||
|
||||
// It's metatype is also a class.
|
||||
IO.print(Foo.type is Class) // expect: true
|
||||
|
||||
// The metatype's metatype is Class.
|
||||
IO.print(Foo.type.type == Class) // expect: true
|
||||
|
||||
// And Class's metatype circles back onto itself.
|
||||
IO.print(Foo.type.type.type == Class) // expect: true
|
||||
IO.print(Foo.type.type.type.type == Class) // expect: true
|
||||
IO.print(Foo.type.type.type.type.type == Class) // expect: true
|
||||
@@ -0,0 +1,7 @@
|
||||
var fiber = new Fiber {
|
||||
Fiber.abort("Error message.")
|
||||
}
|
||||
|
||||
IO.print(fiber.try()) // expect: Error message.
|
||||
IO.print(fiber.isDone) // expect: true
|
||||
IO.print(fiber.error) // expect: Error message.
|
||||
@@ -0,0 +1 @@
|
||||
Fiber.abort("Abort!") // expect runtime error: Abort!
|
||||
@@ -0,0 +1 @@
|
||||
Fiber.abort(123) // expect runtime error: Error message must be a string.
|
||||
@@ -0,0 +1,7 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("fiber")
|
||||
}
|
||||
|
||||
IO.print("before") // expect: before
|
||||
fiber.call() // expect: fiber
|
||||
IO.print("after") // expect: after
|
||||
@@ -0,0 +1,7 @@
|
||||
var fiber
|
||||
|
||||
fiber = new Fiber {
|
||||
fiber.call() // expect runtime error: Fiber has already been called.
|
||||
}
|
||||
|
||||
fiber.call()
|
||||
@@ -0,0 +1,12 @@
|
||||
var a
|
||||
var b
|
||||
|
||||
a = new Fiber {
|
||||
b.call() // expect runtime error: Fiber has already been called.
|
||||
}
|
||||
|
||||
b = new Fiber {
|
||||
a.call()
|
||||
}
|
||||
|
||||
b.call()
|
||||
@@ -0,0 +1,6 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("fiber")
|
||||
}
|
||||
|
||||
var result = fiber.call() // expect: fiber
|
||||
IO.print(result) // expect: null
|
||||
@@ -0,0 +1,7 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("fiber")
|
||||
return "result"
|
||||
}
|
||||
|
||||
var result = fiber.call() // expect: fiber
|
||||
IO.print(result) // expect: result
|
||||
@@ -0,0 +1,6 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("call")
|
||||
}
|
||||
|
||||
fiber.call() // expect: call
|
||||
fiber.call() // expect runtime error: Cannot call a finished fiber.
|
||||
@@ -0,0 +1,9 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("fiber")
|
||||
}
|
||||
|
||||
// The first value passed to the fiber is ignored, since there's no yield call
|
||||
// to return it.
|
||||
IO.print("before") // expect: before
|
||||
fiber.call("ignored") // expect: fiber
|
||||
IO.print("after") // expect: after
|
||||
@@ -0,0 +1,7 @@
|
||||
var fiber
|
||||
|
||||
fiber = new Fiber {
|
||||
fiber.call(2) // expect runtime error: Fiber has already been called.
|
||||
}
|
||||
|
||||
fiber.call(1)
|
||||
@@ -0,0 +1,12 @@
|
||||
var a
|
||||
var b
|
||||
|
||||
a = new Fiber {
|
||||
b.call(3) // expect runtime error: Fiber has already been called.
|
||||
}
|
||||
|
||||
b = new Fiber {
|
||||
a.call(2)
|
||||
}
|
||||
|
||||
b.call(1)
|
||||
@@ -0,0 +1,6 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("call")
|
||||
}
|
||||
|
||||
fiber.call(1) // expect: call
|
||||
fiber.call(2) // expect runtime error: Cannot call a finished fiber.
|
||||
@@ -0,0 +1,7 @@
|
||||
var fiber = new Fiber {
|
||||
"s".unknown
|
||||
}
|
||||
|
||||
IO.print(fiber.error) // expect: null
|
||||
IO.print(fiber.try()) // expect: String does not implement 'unknown'.
|
||||
IO.print(fiber.error) // expect: String does not implement 'unknown'.
|
||||
@@ -0,0 +1,11 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("1")
|
||||
Fiber.yield()
|
||||
IO.print("2")
|
||||
}
|
||||
|
||||
IO.print(fiber.isDone) // expect: false
|
||||
fiber.call() // expect: 1
|
||||
IO.print(fiber.isDone) // expect: false
|
||||
fiber.call() // expect: 2
|
||||
IO.print(fiber.isDone) // expect: true
|
||||
@@ -0,0 +1,6 @@
|
||||
var fiber = new Fiber {
|
||||
"s".unknown
|
||||
}
|
||||
|
||||
fiber.try()
|
||||
IO.print(fiber.isDone) // expect: true
|
||||
@@ -0,0 +1 @@
|
||||
var fiber = new Fiber("not fn") // expect runtime error: Argument must be a function.
|
||||
@@ -0,0 +1,19 @@
|
||||
var b = new Fiber {
|
||||
IO.print("fiber b")
|
||||
}
|
||||
|
||||
var a = new Fiber {
|
||||
IO.print("begin fiber a")
|
||||
b.call()
|
||||
IO.print("end fiber a")
|
||||
}
|
||||
|
||||
IO.print("begin main")
|
||||
a.call()
|
||||
IO.print("end main")
|
||||
|
||||
// expect: begin main
|
||||
// expect: begin fiber a
|
||||
// expect: fiber b
|
||||
// expect: end fiber a
|
||||
// expect: end main
|
||||
@@ -0,0 +1,9 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("fiber")
|
||||
}
|
||||
|
||||
IO.print("before") // expect: before
|
||||
fiber.run() // expect: fiber
|
||||
|
||||
// This does not get run since we exit when the run fiber completes.
|
||||
IO.print("nope")
|
||||
@@ -0,0 +1,10 @@
|
||||
var fiber
|
||||
|
||||
fiber = new Fiber {
|
||||
IO.print(1) // expect: 1
|
||||
fiber.run()
|
||||
IO.print(2) // expect: 2
|
||||
}
|
||||
|
||||
fiber.call()
|
||||
IO.print(3) // expect: 3
|
||||
@@ -0,0 +1,20 @@
|
||||
var a
|
||||
var b
|
||||
|
||||
a = new Fiber {
|
||||
IO.print(2)
|
||||
b.run()
|
||||
IO.print("nope")
|
||||
}
|
||||
|
||||
b = new Fiber {
|
||||
IO.print(1)
|
||||
a.run()
|
||||
IO.print(3)
|
||||
}
|
||||
|
||||
b.call()
|
||||
// expect: 1
|
||||
// expect: 2
|
||||
// expect: 3
|
||||
IO.print(4) // expect: 4
|
||||
@@ -0,0 +1,13 @@
|
||||
var a = new Fiber {
|
||||
IO.print("run")
|
||||
}
|
||||
|
||||
// Run a through an intermediate fiber since it will get discarded and we need
|
||||
// to return to the main one after a completes.
|
||||
var b = new Fiber {
|
||||
a.run()
|
||||
IO.print("nope")
|
||||
}
|
||||
|
||||
b.call() // expect: run
|
||||
a.run() // expect runtime error: Cannot run a finished fiber.
|
||||
@@ -0,0 +1,11 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("fiber")
|
||||
}
|
||||
|
||||
// The first value passed to the fiber is ignored, since there's no yield call
|
||||
// to return it.
|
||||
IO.print("before") // expect: before
|
||||
fiber.run("ignored") // expect: fiber
|
||||
|
||||
// This does not get run since we exit when the run fiber completes.
|
||||
IO.print("nope")
|
||||
@@ -0,0 +1,10 @@
|
||||
var fiber
|
||||
|
||||
fiber = new Fiber {
|
||||
IO.print(1) // expect: 1
|
||||
fiber.run("ignored")
|
||||
IO.print(2) // expect: 2
|
||||
}
|
||||
|
||||
fiber.call()
|
||||
IO.print(3) // expect: 3
|
||||
@@ -0,0 +1,20 @@
|
||||
var a
|
||||
var b
|
||||
|
||||
a = new Fiber {
|
||||
IO.print(2)
|
||||
b.run("ignored")
|
||||
IO.print("nope")
|
||||
}
|
||||
|
||||
b = new Fiber {
|
||||
IO.print(1)
|
||||
a.run("ignored")
|
||||
IO.print(3)
|
||||
}
|
||||
|
||||
b.call()
|
||||
// expect: 1
|
||||
// expect: 2
|
||||
// expect: 3
|
||||
IO.print(4) // expect: 4
|
||||
@@ -0,0 +1,10 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("before")
|
||||
true.unknownMethod
|
||||
IO.print("after")
|
||||
}
|
||||
|
||||
IO.print(fiber.try())
|
||||
// expect: before
|
||||
// expect: Bool does not implement 'unknownMethod'.
|
||||
IO.print("after try") // expect: after try
|
||||
@@ -0,0 +1,7 @@
|
||||
var fiber
|
||||
|
||||
fiber = new Fiber {
|
||||
fiber.try() // expect runtime error: Fiber has already been called.
|
||||
}
|
||||
|
||||
fiber.call()
|
||||
@@ -0,0 +1,12 @@
|
||||
var a
|
||||
var b
|
||||
|
||||
a = new Fiber {
|
||||
b.try() // expect runtime error: Fiber has already been called.
|
||||
}
|
||||
|
||||
b = new Fiber {
|
||||
a.call()
|
||||
}
|
||||
|
||||
b.call()
|
||||
@@ -0,0 +1,6 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("try")
|
||||
}
|
||||
|
||||
fiber.try() // expect: try
|
||||
fiber.try() // expect runtime error: Cannot try a finished fiber.
|
||||
@@ -0,0 +1,8 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("fiber")
|
||||
}
|
||||
|
||||
IO.print("before") // expect: before
|
||||
IO.print(fiber.try()) // expect: fiber
|
||||
// expect: null
|
||||
IO.print("after") // expect: after
|
||||
@@ -0,0 +1,5 @@
|
||||
var fiber = new Fiber {}
|
||||
IO.print(fiber is Fiber) // expect: true
|
||||
IO.print(fiber is Object) // expect: true
|
||||
IO.print(fiber is Bool) // expect: false
|
||||
IO.print(fiber.type == Fiber) // expect: true
|
||||
@@ -0,0 +1,14 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("fiber 1")
|
||||
Fiber.yield()
|
||||
IO.print("fiber 2")
|
||||
Fiber.yield()
|
||||
IO.print("fiber 3")
|
||||
}
|
||||
|
||||
var result = fiber.call() // expect: fiber 1
|
||||
IO.print("main 1") // expect: main 1
|
||||
result = fiber.call() // expect: fiber 2
|
||||
IO.print("main 2") // expect: main 2
|
||||
result = fiber.call() // expect: fiber 3
|
||||
IO.print("main 3") // expect: main 3
|
||||
@@ -0,0 +1,3 @@
|
||||
IO.print("before") // expect: before
|
||||
Fiber.yield()
|
||||
IO.print("not reached")
|
||||
@@ -0,0 +1,14 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("fiber 1")
|
||||
var result = Fiber.yield()
|
||||
IO.print(result)
|
||||
result = Fiber.yield()
|
||||
IO.print(result)
|
||||
}
|
||||
|
||||
fiber.call() // expect: fiber 1
|
||||
IO.print("main 1") // expect: main 1
|
||||
fiber.call("call 1") // expect: call 1
|
||||
IO.print("main 2") // expect: main 2
|
||||
fiber.call() // expect: null
|
||||
IO.print("main 3") // expect: main 3
|
||||
@@ -0,0 +1,12 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("fiber")
|
||||
var result = Fiber.yield()
|
||||
IO.print(result)
|
||||
}
|
||||
|
||||
fiber.call() // expect: fiber
|
||||
IO.print("main") // expect: main
|
||||
fiber.run("run") // expect: run
|
||||
|
||||
// This does not get run since we exit when the run fiber completes.
|
||||
IO.print("nope")
|
||||
@@ -0,0 +1,11 @@
|
||||
var a = new Fiber {
|
||||
IO.print("before") // expect: before
|
||||
Fiber.yield()
|
||||
}
|
||||
|
||||
// Run a chain of fibers. Since none of them are called, they all get discarded
|
||||
// and there is no remaining caller.
|
||||
var b = new Fiber { a.run() }
|
||||
var c = new Fiber { b.run() }
|
||||
c.run()
|
||||
IO.print("not reached")
|
||||
@@ -0,0 +1,14 @@
|
||||
var fiber = new Fiber {
|
||||
IO.print("fiber 1")
|
||||
Fiber.yield("yield 1")
|
||||
IO.print("fiber 2")
|
||||
Fiber.yield("yield 2")
|
||||
IO.print("fiber 3")
|
||||
}
|
||||
|
||||
var result = fiber.call() // expect: fiber 1
|
||||
IO.print(result) // expect: yield 1
|
||||
result = fiber.call() // expect: fiber 2
|
||||
IO.print(result) // expect: yield 2
|
||||
result = fiber.call() // expect: fiber 3
|
||||
IO.print(result) // expect: null
|
||||
@@ -0,0 +1,3 @@
|
||||
IO.print("before") // expect: before
|
||||
Fiber.yield(1)
|
||||
IO.print("not reached")
|
||||
@@ -0,0 +1,11 @@
|
||||
var a = new Fiber {
|
||||
IO.print("before") // expect: before
|
||||
Fiber.yield(1)
|
||||
}
|
||||
|
||||
// Run a chain of fibers. Since none of them are called, they all get discarded
|
||||
// and there is no remaining caller.
|
||||
var b = new Fiber { a.run() }
|
||||
var c = new Fiber { b.run() }
|
||||
c.run()
|
||||
IO.print("not reached")
|
||||
@@ -0,0 +1,5 @@
|
||||
IO.print(new Fn {}.arity) // expect: 0
|
||||
IO.print(new Fn {|a| a}.arity) // expect: 1
|
||||
IO.print(new Fn {|a, b| a}.arity) // expect: 2
|
||||
IO.print(new Fn {|a, b, c| a}.arity) // expect: 3
|
||||
IO.print(new Fn {|a, b, c, d| a}.arity) // expect: 4
|
||||
@@ -0,0 +1,16 @@
|
||||
var f0 = new Fn { IO.print("zero") }
|
||||
var f1 = new Fn {|a| IO.print("one ", a) }
|
||||
var f2 = new Fn {|a, b| IO.print("two ", a, " ", b) }
|
||||
var f3 = new Fn {|a, b, c| IO.print("three ", a, " ", b, " ", c) }
|
||||
|
||||
f0.call("a") // expect: zero
|
||||
f0.call("a", "b") // expect: zero
|
||||
|
||||
f1.call("a", "b") // expect: one a
|
||||
f1.call("a", "b", "c") // expect: one a
|
||||
|
||||
f2.call("a", "b", "c") // expect: two a b
|
||||
f2.call("a", "b", "c", "d") // expect: two a b
|
||||
|
||||
f3.call("a", "b", "c", "d") // expect: three a b c
|
||||
f3.call("a", "b", "c", "d", "e") // expect: three a b c
|
||||
@@ -0,0 +1,2 @@
|
||||
var f2 = new Fn {|a, b| IO.print(a, b) }
|
||||
f2.call("a") // expect runtime error: Function expects more arguments.
|
||||
@@ -0,0 +1,16 @@
|
||||
// Not structurally equal.
|
||||
IO.print(new Fn { 123 } == new Fn { 123 }) // expect: false
|
||||
IO.print(new Fn { 123 } != new Fn { 123 }) // expect: true
|
||||
|
||||
// Not equal to other types.
|
||||
IO.print(new Fn { 123 } == 1) // expect: false
|
||||
IO.print(new Fn { 123 } == false) // expect: false
|
||||
IO.print(new Fn { 123 } == "fn 123") // expect: false
|
||||
IO.print(new Fn { 123 } != 1) // expect: true
|
||||
IO.print(new Fn { 123 } != false) // expect: true
|
||||
IO.print(new Fn { 123 } != "fn 123") // expect: true
|
||||
|
||||
// Equal by identity.
|
||||
var f = new Fn { 123 }
|
||||
IO.print(f == f) // expect: true
|
||||
IO.print(f != f) // expect: false
|
||||
@@ -0,0 +1 @@
|
||||
new Fn(3) // expect runtime error: Argument must be a function.
|
||||
@@ -0,0 +1 @@
|
||||
IO.print(new Fn {}) // expect: <fn>
|
||||
@@ -0,0 +1,4 @@
|
||||
IO.print(new Fn { 0 } is Fn) // expect: true
|
||||
IO.print(new Fn { 0 } is Object) // expect: true
|
||||
IO.print(new Fn { 0 } is String) // expect: false
|
||||
IO.print(new Fn { 0 }.type == Fn) // expect: true
|
||||
@@ -0,0 +1,8 @@
|
||||
var a = [1]
|
||||
a.add(2)
|
||||
IO.print(a) // expect: [1, 2]
|
||||
a.add(3)
|
||||
IO.print(a) // expect: [1, 2, 3]
|
||||
|
||||
// Returns added element.
|
||||
IO.print(a.add(4)) // expect: 4
|
||||
@@ -0,0 +1,11 @@
|
||||
var a = [1]
|
||||
a.addAll([2, 3])
|
||||
IO.print(a) // expect: [1, 2, 3]
|
||||
a.addAll([])
|
||||
IO.print(a) // expect: [1, 2, 3]
|
||||
a.addAll(4..6)
|
||||
IO.print(a) // expect: [1, 2, 3, 4, 5, 6]
|
||||
|
||||
// Returns argument.
|
||||
var range = 7..9
|
||||
IO.print(a.addAll(range) == range) // expect: true
|
||||
@@ -0,0 +1,9 @@
|
||||
var a = [1, 2, 3]
|
||||
var b = a.all {|x| x > 1 }
|
||||
IO.print(b) // expect: false
|
||||
|
||||
var d = a.all {|x| x > 0 }
|
||||
IO.print(d) // expect: true
|
||||
|
||||
var e = [].all {|x| false }
|
||||
IO.print(e) // expect: true
|
||||
@@ -0,0 +1 @@
|
||||
IO.print([1, 2, 3].all {|x| "truthy" }) // expect: true
|
||||
@@ -0,0 +1 @@
|
||||
[1, 2, 3].all("string") // expect runtime error: String does not implement 'call(_)'.
|
||||
@@ -0,0 +1,10 @@
|
||||
var a = [1, 2, 3]
|
||||
|
||||
var b = a.any {|x| x > 3 }
|
||||
IO.print(b) // expect: false
|
||||
|
||||
var d = a.any {|x| x > 1 }
|
||||
IO.print(d) // expect: true
|
||||
|
||||
var e = [].any {|x| true }
|
||||
IO.print(e) // expect: false
|
||||
@@ -0,0 +1 @@
|
||||
IO.print([1, 2, 3].any {|x| "truthy" }) // expect: true
|
||||
@@ -0,0 +1 @@
|
||||
[1, 2, 3].any("string") // expect runtime error: String does not implement 'call(_)'.
|
||||
@@ -0,0 +1,7 @@
|
||||
var a = [1, 2, 3]
|
||||
a.clear()
|
||||
IO.print(a) // expect: []
|
||||
IO.print(a.count) // expect: 0
|
||||
|
||||
// Returns null.
|
||||
IO.print([1, 2].clear()) // expect: null
|
||||
@@ -0,0 +1,3 @@
|
||||
IO.print([].count) // expect: 0
|
||||
IO.print([1].count) // expect: 1
|
||||
IO.print([1, 2, 3, 4].count) // expect: 4
|
||||
@@ -0,0 +1,41 @@
|
||||
// Add to empty list.
|
||||
var a = []
|
||||
a.insert(1, 0)
|
||||
IO.print(a) // expect: [1]
|
||||
|
||||
// Normal indices.
|
||||
var b = [1, 2, 3]
|
||||
b.insert(4, 0)
|
||||
IO.print(b) // expect: [4, 1, 2, 3]
|
||||
|
||||
var c = [1, 2, 3]
|
||||
c.insert(4, 1)
|
||||
IO.print(c) // expect: [1, 4, 2, 3]
|
||||
|
||||
var d = [1, 2, 3]
|
||||
d.insert(4, 2)
|
||||
IO.print(d) // expect: [1, 2, 4, 3]
|
||||
|
||||
var e = [1, 2, 3]
|
||||
e.insert(4, 3)
|
||||
IO.print(e) // expect: [1, 2, 3, 4]
|
||||
|
||||
// Negative indices.
|
||||
var f = [1, 2, 3]
|
||||
f.insert(4, -4)
|
||||
IO.print(f) // expect: [4, 1, 2, 3]
|
||||
|
||||
var g = [1, 2, 3]
|
||||
g.insert(4, -3)
|
||||
IO.print(g) // expect: [1, 4, 2, 3]
|
||||
|
||||
var h = [1, 2, 3]
|
||||
h.insert(4, -2)
|
||||
IO.print(h) // expect: [1, 2, 4, 3]
|
||||
|
||||
var i = [1, 2, 3]
|
||||
i.insert(4, -1)
|
||||
IO.print(i) // expect: [1, 2, 3, 4]
|
||||
|
||||
// Returns.inserted value.
|
||||
IO.print([1, 2].insert(3, 0)) // expect: 3
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.insert("value", 1.5) // expect runtime error: Index must be an integer.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.insert("value", "2") // expect runtime error: Index must be a number.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.insert("value", 4) // expect runtime error: Index out of bounds.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.insert("value", -5) // expect runtime error: Index out of bounds.
|
||||
@@ -0,0 +1,13 @@
|
||||
var a = ["one", "two", "three", "four"]
|
||||
IO.print(a.iterate(null)) // expect: 0
|
||||
IO.print(a.iterate(0)) // expect: 1
|
||||
IO.print(a.iterate(1)) // expect: 2
|
||||
IO.print(a.iterate(2)) // expect: 3
|
||||
IO.print(a.iterate(3)) // expect: false
|
||||
|
||||
// Out of bounds.
|
||||
IO.print(a.iterate(123)) // expect: false
|
||||
IO.print(a.iterate(-1)) // expect: false
|
||||
|
||||
// Nothing to iterate in an empty list.
|
||||
IO.print([].iterate(null)) // expect: false
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.iterate(1.5) // expect runtime error: Iterator must be an integer.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.iterate("2") // expect runtime error: Iterator must be a number.
|
||||
@@ -0,0 +1,5 @@
|
||||
var a = ["one", "two", "three", "four"]
|
||||
IO.print(a.iteratorValue(0)) // expect: one
|
||||
IO.print(a.iteratorValue(1)) // expect: two
|
||||
IO.print(a.iteratorValue(2)) // expect: three
|
||||
IO.print(a.iteratorValue(3)) // expect: four
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.iteratorValue(1.5) // expect runtime error: Iterator must be an integer.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.iteratorValue("2") // expect runtime error: Iterator must be a number.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.iteratorValue(4) // expect runtime error: Iterator out of bounds.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.iteratorValue(-5) // expect runtime error: Iterator out of bounds.
|
||||
@@ -0,0 +1,23 @@
|
||||
// Handle empty list.
|
||||
IO.print([].join(",") == "") // expect: true
|
||||
|
||||
// Handle a simple list with an empty delimeter.
|
||||
IO.print([1, 2, 3].join("")) // expect: 123
|
||||
|
||||
// Handle a simple list with no separator.
|
||||
IO.print([1, 2, 3].join) // expect: 123
|
||||
|
||||
// Does not quote strings.
|
||||
IO.print([1, "2", true].join(",")) // expect: 1,2,true
|
||||
|
||||
// Nested lists.
|
||||
IO.print([1, [2, [3], 4], 5].join(",")) // expect: 1,[2, [3], 4],5
|
||||
|
||||
// Calls toString on elements.
|
||||
class Foo {
|
||||
toString { "Foo.toString" }
|
||||
}
|
||||
|
||||
IO.print([1, new Foo, 2].join(", ")) // expect: 1, Foo.toString, 2
|
||||
|
||||
// TODO: Handle lists that contain themselves.
|
||||
@@ -0,0 +1 @@
|
||||
[1, 2, 3].join(2) // expect runtime error: Right operand must be a string.
|
||||
@@ -0,0 +1,3 @@
|
||||
var a = [1, 2, 3]
|
||||
var b = a.map {|x| x + 1 }
|
||||
IO.print(b) // expect: [2, 3, 4]
|
||||
@@ -0,0 +1,6 @@
|
||||
var list = new List
|
||||
|
||||
IO.print(list.count) // expect: 0
|
||||
IO.print(list) // expect: []
|
||||
list.add(1)
|
||||
IO.print(list) // expect: [1]
|
||||
@@ -0,0 +1,2 @@
|
||||
IO.print(![1, 2]) // expect: false
|
||||
IO.print(![]) // expect: false
|
||||
@@ -0,0 +1,18 @@
|
||||
var a = [1, 2, 3]
|
||||
var b = [4, 5, 6]
|
||||
var c = a + b
|
||||
var d = a + (4..6)
|
||||
var e = a + []
|
||||
var f = [] + a
|
||||
var g = [] + []
|
||||
|
||||
IO.print(a) // expect: [1, 2, 3]
|
||||
IO.print(b) // expect: [4, 5, 6]
|
||||
IO.print(c) // expect: [1, 2, 3, 4, 5, 6]
|
||||
IO.print(d) // expect: [1, 2, 3, 4, 5, 6]
|
||||
IO.print(e) // expect: [1, 2, 3]
|
||||
IO.print(f) // expect: [1, 2, 3]
|
||||
IO.print(g) // expect: []
|
||||
|
||||
// Doesn't modify original list.
|
||||
IO.print(a) // expect: [1, 2, 3]
|
||||
@@ -0,0 +1,14 @@
|
||||
var a = [1, 4, 2, 1, 5]
|
||||
var b = ["W", "o", "r", "l", "d"]
|
||||
var max = new Fn {|a, b| a > b ? a : b }
|
||||
var sum = new Fn {|a, b| a + b }
|
||||
|
||||
IO.print(a.reduce(max)) // expect: 5
|
||||
IO.print(a.reduce(10, max)) // expect: 10
|
||||
|
||||
IO.print(a.reduce(sum)) // expect: 13
|
||||
IO.print(a.reduce(-1, sum)) // expect: 12
|
||||
|
||||
// sum also concatenates strings
|
||||
IO.print(b.reduce("Hello ", sum)) // expect: Hello World
|
||||
IO.print(b.reduce(sum)) // expect: World
|
||||
@@ -0,0 +1 @@
|
||||
[].reduce {|a, b| 1 } // expect runtime error: Can't reduce an empty sequence.
|
||||
@@ -0,0 +1,2 @@
|
||||
IO.print([1].reduce {|a, b| 42 }) // expect: 1
|
||||
IO.print([].reduce(1) {|a, b| 42 }) // expect: 1
|
||||
@@ -0,0 +1 @@
|
||||
[1, 2, 3].reduce {|x, y, z| x } // expect runtime error: Function expects more arguments.
|
||||
@@ -0,0 +1,27 @@
|
||||
var a = [1, 2, 3]
|
||||
a.removeAt(0)
|
||||
IO.print(a) // expect: [2, 3]
|
||||
|
||||
var b = [1, 2, 3]
|
||||
b.removeAt(1)
|
||||
IO.print(b) // expect: [1, 3]
|
||||
|
||||
var c = [1, 2, 3]
|
||||
c.removeAt(2)
|
||||
IO.print(c) // expect: [1, 2]
|
||||
|
||||
// Index backwards from end.
|
||||
var d = [1, 2, 3]
|
||||
d.removeAt(-3)
|
||||
IO.print(d) // expect: [2, 3]
|
||||
|
||||
var e = [1, 2, 3]
|
||||
e.removeAt(-2)
|
||||
IO.print(e) // expect: [1, 3]
|
||||
|
||||
var f = [1, 2, 3]
|
||||
f.removeAt(-1)
|
||||
IO.print(f) // expect: [1, 2]
|
||||
|
||||
// Return the removed value.
|
||||
IO.print([3, 4, 5].removeAt(1)) // expect: 4
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.removeAt(1.5) // expect runtime error: Index must be an integer.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.removeAt("2") // expect runtime error: Index must be a number.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.removeAt(4) // expect runtime error: Index out of bounds.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a.removeAt(-5) // expect runtime error: Index out of bounds.
|
||||
@@ -0,0 +1,12 @@
|
||||
// Returns elements.
|
||||
var list = ["a", "b", "c", "d"]
|
||||
IO.print(list[0]) // expect: a
|
||||
IO.print(list[1]) // expect: b
|
||||
IO.print(list[2]) // expect: c
|
||||
IO.print(list[3]) // expect: d
|
||||
|
||||
// Allows indexing backwards from the end.
|
||||
IO.print(list[-4]) // expect: a
|
||||
IO.print(list[-3]) // expect: b
|
||||
IO.print(list[-2]) // expect: c
|
||||
IO.print(list[-1]) // expect: d
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a[1.5] // expect runtime error: Subscript must be an integer.
|
||||
@@ -0,0 +1,35 @@
|
||||
// Returns lists.
|
||||
var list = ["a", "b", "c", "d", "e"]
|
||||
IO.print(list[0..0]) // expect: [a]
|
||||
IO.print(list[1...1]) // expect: []
|
||||
IO.print(list[1..2]) // expect: [b, c]
|
||||
IO.print(list[1...2]) // expect: [b]
|
||||
IO.print(list[2..4]) // expect: [c, d, e]
|
||||
IO.print(list[2...5]) // expect: [c, d, e]
|
||||
|
||||
// A backwards range reverses.
|
||||
IO.print(list[3..1]) // expect: [d, c, b]
|
||||
IO.print(list[3...1]) // expect: [d, c]
|
||||
IO.print(list[3...3]) // expect: []
|
||||
|
||||
// Negative ranges index from the end.
|
||||
IO.print(list[-5..-2]) // expect: [a, b, c, d]
|
||||
IO.print(list[-5...-2]) // expect: [a, b, c]
|
||||
IO.print(list[-3..-5]) // expect: [c, b, a]
|
||||
IO.print(list[-3...-6]) // expect: [c, b, a]
|
||||
|
||||
// Half-negative ranges are treated like the negative value is fixed before
|
||||
// walking the range.
|
||||
IO.print(list[-5..3]) // expect: [a, b, c, d]
|
||||
IO.print(list[-3...5]) // expect: [c, d, e]
|
||||
IO.print(list[-2..1]) // expect: [d, c, b]
|
||||
IO.print(list[-2...0]) // expect: [d, c, b]
|
||||
|
||||
IO.print(list[1..-2]) // expect: [b, c, d]
|
||||
IO.print(list[2...-1]) // expect: [c, d]
|
||||
IO.print(list[4..-5]) // expect: [e, d, c, b, a]
|
||||
IO.print(list[3...-6]) // expect: [d, c, b, a]
|
||||
|
||||
// An empty range at zero is allowed on an empty list.
|
||||
IO.print([][0...0]) // expect: []
|
||||
IO.print([][0..-1]) // expect: []
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a[1.5..2] // expect runtime error: Range start must be an integer.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a[3..2] // expect runtime error: Range start out of bounds.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a[-4..2] // expect runtime error: Range start out of bounds.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a[1...4] // expect runtime error: Range end out of bounds.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = [1, 2, 3]
|
||||
a[0...-5] // expect runtime error: Range end out of bounds.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user