214 lines
5.3 KiB
Plaintext
214 lines
5.3 KiB
Plaintext
type Row {
|
|
name: Text
|
|
count: Int
|
|
}
|
|
|
|
type Result {
|
|
Ready(value: Int)
|
|
error Failed(value: Int)
|
|
}
|
|
|
|
checked(value: Int < 0) (answer: Int) {
|
|
fail(Result.Failed(value))
|
|
}
|
|
checked(value: other) (answer: Int) {
|
|
answer = value
|
|
}
|
|
|
|
double(value: Int) (answer: Int) {
|
|
answer = value * 2
|
|
}
|
|
|
|
positive(value: Int) (answer: Bool) {
|
|
answer = value > 0
|
|
}
|
|
|
|
above(value: Int, threshold: Int) (answer: Bool) {
|
|
answer = value > threshold
|
|
}
|
|
|
|
add(value: Int, state: Int) (next: Int) {
|
|
next = state + value
|
|
}
|
|
|
|
stop(value: Int, state: Int) (next: Int, stop: Bool) {
|
|
next = state + value
|
|
stop = next >= 3
|
|
}
|
|
|
|
ignore(value: Int) () {
|
|
|
|
}
|
|
|
|
append(value: Text, suffix: Text) (answer: Text) {
|
|
answer = value + suffix
|
|
}
|
|
|
|
change(value: Row) (answer: Row) {
|
|
answer = value
|
|
answer.name = value.name + "新"
|
|
answer.count = value.count + 1
|
|
}
|
|
|
|
keepRow(value: Row, threshold: Int) (answer: Bool) {
|
|
answer = value.count > threshold
|
|
}
|
|
|
|
extend(value: Text, state: Text) (next: Text) {
|
|
next = state + value
|
|
}
|
|
|
|
mapInts(values: List<Int>) (answer: List<Int>) {
|
|
answer = each(double, values)
|
|
}
|
|
|
|
filterInts(values: List<Int>) (answer: List<Int>) {
|
|
answer = filter(positive, values)
|
|
}
|
|
|
|
findInt(values: List<Int>, threshold: Int) (answer: Int?) {
|
|
answer = find(above, values, threshold)
|
|
}
|
|
|
|
projectSum(values: List<Int>) (answer: Int) {
|
|
answer = sum(double, values)
|
|
}
|
|
|
|
foldSum(values: List<Int>) (answer: Int) {
|
|
answer = reduce(add, values, 0)
|
|
}
|
|
|
|
stopSum(values: List<Int>) (answer: Int) {
|
|
answer = reduceUntil(stop, values, 0)
|
|
}
|
|
|
|
mapRows(values: List<Row>) (answer: List<Row>) {
|
|
answer = each(change, values)
|
|
}
|
|
|
|
projectFloat(value: Float) (answer: Float) {
|
|
answer = value * 2.0
|
|
}
|
|
|
|
projectDecimal(value: Decimal) (answer: Decimal) {
|
|
answer = value * 2
|
|
}
|
|
|
|
floatSum(values: List<Float>) (answer: Float) {
|
|
answer = sum(projectFloat, values)
|
|
}
|
|
|
|
decimalSum(values: List<Decimal>) (answer: Decimal) {
|
|
answer = sum(projectDecimal, values)
|
|
}
|
|
|
|
captureList(values: List<Int>) (answer: Result) {
|
|
answer = result(checkedSum(values))
|
|
}
|
|
|
|
checkedSum(values: List<Int>) (answer: Int) {
|
|
answer = sum(checked, values)
|
|
}
|
|
|
|
insertNext(item: Int, state: Map<Int, Int>) (next: Map<Int, Int>) {
|
|
snapshot = state
|
|
key = length(snapshot)
|
|
key = key + 1
|
|
next = put(state, key, item + length(snapshot))
|
|
}
|
|
|
|
verify() (answer: Bool) recover("compare captured test failures with their expected values") {
|
|
values = [1, -2, 3]
|
|
original = Row { name = "雪"
|
|
count = 2 }
|
|
rows = [original]
|
|
changed = mapRows(rows)
|
|
selected = filter(keepRow, rows, 1)
|
|
found = find(keepRow, rows, 1)
|
|
texts = each(append, ["雪", "山"], "新")
|
|
each(ignore, values)
|
|
empty = each(double, [])
|
|
answer = mapInts(values) == [2, -4, 6]
|
|
answer = answer and filterInts(values) == [1, 3] and findInt(values, 1) == 3 and findInt(values, 3) == null
|
|
answer = answer and projectSum(values) == 4 and foldSum(values) == 2 and stopSum([1, 2, 9223372036854775807]) == 3
|
|
answer = answer and length(empty) == 0 and sum(double, []) == 0 and reduce(add, [], 9) == 9 and reduceUntil(stop, [], 9) == 9
|
|
answer = answer and reduce(checkedAdd, [], 7) == 7 and reduce(checkedAdd, [1, 2, 3], 7) == 13
|
|
answer = answer and texts == ["雪新", "山新"] and reduce(extend, ["雪", "山"], "前") == "前雪山"
|
|
answer = answer and changed == [Row { name = "雪新"
|
|
count = 3 }] and selected == rows and found == original and original.name == "雪" and original.count == 2
|
|
answer = answer and floatSum([1.5, 2.5]) == floatEight() and decimalSum([1.5, 2.5]) == 8
|
|
answer = answer and floatSum([]) == floatZero() and decimalSum([]) == 0
|
|
answer = answer and captureList([1, -2, 3]) == Result.Failed(-2) and captureList([1, 2, 3]) == Result.Ready(6)
|
|
partial = changePartial(original)
|
|
dependent = changeDependent(original)
|
|
answer = answer and partial.name == "雪局" and partial.count == 2 and dependent.name == "雪顺" and dependent.count == 2 and original.name == "雪"
|
|
table = {0 = 7}
|
|
inserted = reduce(insertNext, [2, 3], table)
|
|
answer = answer and inserted == {0 = 7, 2 = 3, 3 = 5} and table == {0 = 7}
|
|
answer = answer and reduce(insertNext, [], table) == table
|
|
}
|
|
|
|
failureEntry() (answer: Int) {
|
|
answer = checkedSum([1, -2, 3])
|
|
}
|
|
|
|
overflowEntry() (answer: Int) {
|
|
answer = sum(addContext, [9223372036854775807, 1], 0)
|
|
}
|
|
|
|
addContext(value: Int, context: Int) (answer: Int) {
|
|
answer = value + context
|
|
}
|
|
|
|
handlerFaultEntry() (answer: Int) {
|
|
answer = projectSum([9223372036854775807])
|
|
}
|
|
|
|
extraEntry() (answer: Int) {
|
|
answer = sum(addContext, [], checked(-9))
|
|
}
|
|
|
|
floatEight() (answer: Float) {
|
|
answer = 8.0
|
|
}
|
|
|
|
floatZero() (answer: Float) {
|
|
answer = 0.0
|
|
}
|
|
|
|
changePartial(value: Row) (answer: Row) {
|
|
answer = value
|
|
answer.name = value.name + "局"
|
|
}
|
|
|
|
changeDependent(value: Row) (answer: Row) {
|
|
answer = value
|
|
answer.name = value.name + "顺"
|
|
answer.count = length(answer.name)
|
|
}
|
|
|
|
failedRow(value: Row) (answer: Row) {
|
|
amount = checked(value.count)
|
|
answer = Row { name = value.name
|
|
count = amount }
|
|
}
|
|
|
|
changeFailed(value: Row) (answer: Row) {
|
|
answer = failedRow(value)
|
|
answer.name = "替"
|
|
answer.count = 0
|
|
}
|
|
|
|
initializeEntry() (answer: Row) {
|
|
answer = changeFailed(Row { name = "原"
|
|
count = -1 })
|
|
}
|
|
|
|
checkedAdd(value: Int, state: Int) (next: Int) {
|
|
next = state + checked(value)
|
|
}
|
|
|
|
reductionFailureEntry() (answer: Int) {
|
|
answer = reduce(checkedAdd, [1, -2, 9223372036854775807], 0)
|
|
}
|