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,7 @@
|
||||
var a = {1: 1, 2: 2, 3: 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,11 @@
|
||||
var map = {
|
||||
"one": 1,
|
||||
"two": 2,
|
||||
"three": 3
|
||||
}
|
||||
|
||||
IO.print(map.containsKey("one")) // expect: true
|
||||
IO.print(map.containsKey("two")) // expect: true
|
||||
IO.print(map.containsKey("three")) // expect: true
|
||||
IO.print(map.containsKey("four")) // expect: false
|
||||
IO.print(map.containsKey("five")) // expect: false
|
||||
@@ -0,0 +1 @@
|
||||
var result = {}.containsKey([]) // expect runtime error: Key must be a value type.
|
||||
@@ -0,0 +1,12 @@
|
||||
var map = {}
|
||||
IO.print(map.count) // expect: 0
|
||||
map["one"] = "value"
|
||||
IO.print(map.count) // expect: 1
|
||||
map["two"] = "value"
|
||||
IO.print(map.count) // expect: 2
|
||||
map["three"] = "value"
|
||||
IO.print(map.count) // expect: 3
|
||||
|
||||
// Adding existing key does not increase count.
|
||||
map["two"] = "new value"
|
||||
IO.print(map.count) // expect: 3
|
||||
@@ -0,0 +1,45 @@
|
||||
var a = {"one": 1, "two": 2, "three": 3, "four": 4}.keys
|
||||
|
||||
// The precise numeric values aren't defined since they are indexes into the
|
||||
// entry table and the hashing process isn't specified. So we just validate
|
||||
// what we can assume about them.
|
||||
|
||||
IO.print(a.iterate(null) is Num) // expect: true
|
||||
IO.print(a.iterate(null) >= 0) // expect: true
|
||||
|
||||
IO.print(a.iterate(0) is Num) // expect: true
|
||||
IO.print(a.iterate(0) > 0) // expect: true
|
||||
IO.print(a.iterate(1) is Num) // expect: true
|
||||
IO.print(a.iterate(1) > 0) // expect: true
|
||||
IO.print(a.iterate(2) is Num) // expect: true
|
||||
IO.print(a.iterate(2) > 0) // expect: true
|
||||
IO.print(a.iterate(3) is Num) // expect: true
|
||||
IO.print(a.iterate(3) > 0) // expect: true
|
||||
|
||||
var previous = -1
|
||||
var iterator = a.iterate(null)
|
||||
while (iterator) {
|
||||
IO.print(iterator > previous)
|
||||
IO.print(iterator is Num)
|
||||
previous = iterator
|
||||
iterator = a.iterate(iterator)
|
||||
}
|
||||
// First entry:
|
||||
// expect: true
|
||||
// expect: true
|
||||
// Second entry:
|
||||
// expect: true
|
||||
// expect: true
|
||||
// Third entry:
|
||||
// expect: true
|
||||
// expect: true
|
||||
// Fourth entry:
|
||||
// expect: true
|
||||
// expect: true
|
||||
|
||||
// Out of bounds.
|
||||
IO.print(a.iterate(16)) // expect: false
|
||||
IO.print(a.iterate(-1)) // expect: false
|
||||
|
||||
// Nothing to iterate in an empty map.
|
||||
IO.print({}.keys.iterate(null)) // expect: false
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = {1: 2, 3: 4}
|
||||
a.keys.iterate(1.5) // expect runtime error: Iterator must be an integer.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = {1: 2, 3: 4}
|
||||
a.keys.iterate("2") // expect runtime error: Iterator must be a number.
|
||||
@@ -0,0 +1,43 @@
|
||||
var map = {
|
||||
null: "null value",
|
||||
true: "true value",
|
||||
false: "false value",
|
||||
0: "zero",
|
||||
1.2: "1 point 2",
|
||||
List: "list class",
|
||||
"null": "string value",
|
||||
(1..3): "1 to 3"
|
||||
}
|
||||
|
||||
IO.print(map[null]) // expect: null value
|
||||
IO.print(map[true]) // expect: true value
|
||||
IO.print(map[false]) // expect: false value
|
||||
IO.print(map[0]) // expect: zero
|
||||
IO.print(map[1.2]) // expect: 1 point 2
|
||||
IO.print(map[List]) // expect: list class
|
||||
IO.print(map["null"]) // expect: string value
|
||||
IO.print(map[1..3]) // expect: 1 to 3
|
||||
|
||||
IO.print(map.count) // expect: 8
|
||||
|
||||
// Use the same keys (but sometimes different objects) to ensure keys have the
|
||||
// right equality semantics.
|
||||
map[null] = "new null value"
|
||||
map[!false] = "new true value"
|
||||
map[!true] = "new false value"
|
||||
map[2 - 2] = "new zero"
|
||||
map[1.2] = "new 1 point 2"
|
||||
map[[].type] = "new list class"
|
||||
map["nu" + "ll"] = "new string value"
|
||||
map[(3 - 2)..(1 + 2)] = "new 1 to 3"
|
||||
|
||||
IO.print(map[null]) // expect: new null value
|
||||
IO.print(map[true]) // expect: new true value
|
||||
IO.print(map[false]) // expect: new false value
|
||||
IO.print(map[0]) // expect: new zero
|
||||
IO.print(map[1.2]) // expect: new 1 point 2
|
||||
IO.print(map[List]) // expect: new list class
|
||||
IO.print(map["null"]) // expect: new string value
|
||||
IO.print(map[1..3]) // expect: new 1 to 3
|
||||
|
||||
IO.print(map.count) // expect: 8
|
||||
@@ -0,0 +1,4 @@
|
||||
var map = new Map
|
||||
|
||||
IO.print(map.count) // expect: 0
|
||||
IO.print(map) // expect: {}
|
||||
@@ -0,0 +1,18 @@
|
||||
var map = {
|
||||
"one": 1,
|
||||
"two": 2,
|
||||
"three": 3
|
||||
}
|
||||
|
||||
IO.print(map.count) // expect: 3
|
||||
IO.print(map.remove("two")) // expect: 2
|
||||
IO.print(map.count) // expect: 2
|
||||
IO.print(map.remove("three")) // expect: 3
|
||||
IO.print(map.count) // expect: 1
|
||||
|
||||
// Remove an already removed entry.
|
||||
IO.print(map.remove("two")) // expect: null
|
||||
IO.print(map.count) // expect: 1
|
||||
|
||||
IO.print(map.remove("one")) // expect: 1
|
||||
IO.print(map.count) // expect: 0
|
||||
@@ -0,0 +1 @@
|
||||
var result = {}.remove([]) // expect runtime error: Key must be a value type.
|
||||
@@ -0,0 +1,4 @@
|
||||
// This is a regression test to ensure map handles a null entry array.
|
||||
|
||||
var map = {}
|
||||
IO.print(map["key"]) // expect: null
|
||||
@@ -0,0 +1 @@
|
||||
var result = {}[[]] // expect runtime error: Key must be a value type.
|
||||
@@ -0,0 +1 @@
|
||||
var result = {}[[]] = "value" // expect runtime error: Key must be a value type.
|
||||
@@ -0,0 +1,27 @@
|
||||
// Handle empty map.
|
||||
IO.print({}.toString) // expect: {}
|
||||
|
||||
// Does not quote strings.
|
||||
IO.print({"1": "2"}.toString) // expect: {1: 2}
|
||||
|
||||
// Nested maps.
|
||||
IO.print({1: {2: {}}}) // expect: {1: {2: {}}}
|
||||
|
||||
// Calls toString on elements.
|
||||
class Foo {
|
||||
toString { "Foo.toString" }
|
||||
}
|
||||
|
||||
IO.print({1: new Foo}) // expect: {1: Foo.toString}
|
||||
|
||||
// Since iteration order is unspecified, we don't know what order the results
|
||||
// will be.
|
||||
var s = {1: 2, 3: 4, 5: 6}.toString
|
||||
IO.print(s == "{1: 2, 3: 4, 5: 6}" ||
|
||||
s == "{1: 2, 5: 6, 3: 4}" ||
|
||||
s == "{3: 4, 1: 2, 5: 6}" ||
|
||||
s == "{3: 4, 5: 6, 1: 2}" ||
|
||||
s == "{5: 6, 1: 2, 3: 4}" ||
|
||||
s == "{5: 6, 3: 4, 1: 2}") // expect: true
|
||||
|
||||
// TODO: Handle maps that contain themselves.
|
||||
@@ -0,0 +1,5 @@
|
||||
IO.print({} is Map) // expect: true
|
||||
// TODO: Abstract base class for associations.
|
||||
IO.print({} is Object) // expect: true
|
||||
IO.print({} is Bool) // expect: false
|
||||
IO.print({}.type == Map) // expect: true
|
||||
@@ -0,0 +1,45 @@
|
||||
var a = {"one": 1, "two": 2, "three": 3, "four": 4}.values
|
||||
|
||||
// The precise numeric values aren't defined since they are indexes into the
|
||||
// entry table and the hashing process isn't specified. So we just validate
|
||||
// what we can assume about them.
|
||||
|
||||
IO.print(a.iterate(null) is Num) // expect: true
|
||||
IO.print(a.iterate(null) >= 0) // expect: true
|
||||
|
||||
IO.print(a.iterate(0) is Num) // expect: true
|
||||
IO.print(a.iterate(0) > 0) // expect: true
|
||||
IO.print(a.iterate(1) is Num) // expect: true
|
||||
IO.print(a.iterate(1) > 0) // expect: true
|
||||
IO.print(a.iterate(2) is Num) // expect: true
|
||||
IO.print(a.iterate(2) > 0) // expect: true
|
||||
IO.print(a.iterate(3) is Num) // expect: true
|
||||
IO.print(a.iterate(3) > 0) // expect: true
|
||||
|
||||
var previous = -1
|
||||
var iterator = a.iterate(null)
|
||||
while (iterator) {
|
||||
IO.print(iterator > previous)
|
||||
IO.print(iterator is Num)
|
||||
previous = iterator
|
||||
iterator = a.iterate(iterator)
|
||||
}
|
||||
// First entry:
|
||||
// expect: true
|
||||
// expect: true
|
||||
// Second entry:
|
||||
// expect: true
|
||||
// expect: true
|
||||
// Third entry:
|
||||
// expect: true
|
||||
// expect: true
|
||||
// Fourth entry:
|
||||
// expect: true
|
||||
// expect: true
|
||||
|
||||
// Out of bounds.
|
||||
IO.print(a.iterate(16)) // expect: false
|
||||
IO.print(a.iterate(-1)) // expect: false
|
||||
|
||||
// Nothing to iterate in an empty map.
|
||||
IO.print({}.values.iterate(null)) // expect: false
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = {1: 2, 3: 4}
|
||||
a.values.iterate(1.5) // expect runtime error: Iterator must be an integer.
|
||||
@@ -0,0 +1,2 @@
|
||||
var a = {1: 2, 3: 4}
|
||||
a.values.iterate("2") // expect runtime error: Iterator must be a number.
|
||||
Reference in New Issue
Block a user