Skip to content

Commit

Permalink
Add acceptance/performance test with a program that calculates Fibonn…
Browse files Browse the repository at this point in the history
…aci numbers.
  • Loading branch information
Dan Cutting committed Mar 9, 2018
1 parent 617ebb4 commit 865005f
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 0 deletions.
3 changes: 3 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ let package = Package(
dependencies: ["Syft", "Utility"]),
.testTarget(
name: "SongTests",
dependencies: ["Song"]),
.testTarget(
name: "SongPerformanceTests",
dependencies: ["Song"])
]
)
20 changes: 20 additions & 0 deletions Tests/SongPerformanceTests/FibonacciTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import XCTest
import Song

class FibonacciTests: XCTestCase {

func test() {
let code = """
n.fib = n.fib(0, 1)
0.fib(a, _) = a
n.fib(a, b) When n > 0 = (n-1).fib(b, a+b)
80.fib
"""
measure {
assertNoThrow {
XCTAssertEqual(Expression.int(23416728348467685), try evaluate(code))
}
}
}
}
35 changes: 35 additions & 0 deletions Tests/SongPerformanceTests/PerformanceHelpers.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import XCTest
import Song

func assertNoThrow(file: StaticString = #file, line: UInt = #line, _ closure: () throws -> Void) {
do {
try closure()
} catch {
XCTFail("\(error)", file: file, line: line)
}
}

func evaluate(_ code: String) throws -> Expression? {
let parser = makeParser()
let transformer = makeTransformer()
let lines = code.split(separator: "\n")
var context = Context()
var lastEval: Expression?
for line in lines {
let result = parser.parse(String(line))
let expression = try transformer.transform(result)
let evaluated = try expression.evaluate(context: context)
if case .closure(let name, _, _) = evaluated {
if let name = name {
context = extendContext(context: context, name: name, value: evaluated)
}
}
if case .assign(let variable, let value) = evaluated {
if case .name(let name) = variable {
context = extendContext(context: context, name: name, value: value)
}
}
lastEval = evaluated
}
return lastEval
}

0 comments on commit 865005f

Please sign in to comment.