Remove custom Result type and throw errors
This commit is contained in:
@@ -2,16 +2,10 @@ import Foundation
|
||||
import XCTest
|
||||
import Stencil
|
||||
|
||||
class ErrorNodeError : Error {
|
||||
var description: String {
|
||||
return "Node Error"
|
||||
}
|
||||
}
|
||||
|
||||
class ErrorNode : Node {
|
||||
func render(context: Context) -> Result {
|
||||
|
||||
return .Error(ErrorNodeError())
|
||||
class ErrorNode : NodeType {
|
||||
func render(context: Context) throws -> String {
|
||||
throw TemplateSyntaxError("Custom Error")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,73 +24,39 @@ class NodeTests: XCTestCase {
|
||||
class TextNodeTests: NodeTests {
|
||||
func testTextNodeResolvesText() {
|
||||
let node = TextNode(text:"Hello World")
|
||||
let _ = node.render(context)
|
||||
|
||||
switch node.render(context) {
|
||||
case .Success(let string):
|
||||
XCTAssertEqual(string, "Hello World")
|
||||
case .Error:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
}
|
||||
XCTAssertEqual(try? node.render(context), "Hello World")
|
||||
}
|
||||
}
|
||||
|
||||
class VariableNodeTests: NodeTests {
|
||||
func testVariableNodeResolvesVariable() {
|
||||
let node = VariableNode(variable:Variable("name"))
|
||||
|
||||
switch node.render(context) {
|
||||
case .Success(let string):
|
||||
XCTAssertEqual(string, "Kyle")
|
||||
case .Error:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
}
|
||||
XCTAssertEqual(try? node.render(context), "Kyle")
|
||||
}
|
||||
|
||||
func testVariableNodeResolvesNonStringVariable() {
|
||||
let node = VariableNode(variable:Variable("age"))
|
||||
|
||||
switch node.render(context) {
|
||||
case .Success(let string):
|
||||
XCTAssertEqual(string, "27")
|
||||
case .Error:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
}
|
||||
XCTAssertEqual(try? node.render(context), "27")
|
||||
}
|
||||
}
|
||||
|
||||
class RenderNodeTests: NodeTests {
|
||||
func testRenderingNodes() {
|
||||
let nodes = [TextNode(text:"Hello "), VariableNode(variable: "name")] as [Node]
|
||||
switch renderNodes(nodes, context: context) {
|
||||
case .Success(let result):
|
||||
XCTAssertEqual(result, "Hello Kyle")
|
||||
case .Error:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
}
|
||||
let nodes = [TextNode(text:"Hello "), VariableNode(variable: "name")] as [NodeType]
|
||||
XCTAssertEqual(try? renderNodes(nodes, context), "Hello Kyle")
|
||||
}
|
||||
|
||||
func testRenderingNodesWithFailure() {
|
||||
let nodes = [TextNode(text:"Hello "), VariableNode(variable: "name"), ErrorNode()] as [Node]
|
||||
let nodes = [TextNode(text:"Hello "), VariableNode(variable: "name"), ErrorNode()] as [NodeType]
|
||||
|
||||
switch renderNodes(nodes, context: context) {
|
||||
case .Success:
|
||||
XCTAssert(false, "Unexpected success")
|
||||
case .Error(let error):
|
||||
XCTAssertEqual("\(error)", "Node Error")
|
||||
}
|
||||
assertFailure(try renderNodes(nodes, context), TemplateSyntaxError("Custom Error"))
|
||||
}
|
||||
}
|
||||
|
||||
class ForNodeTests: NodeTests {
|
||||
func testForNodeRender() {
|
||||
let node = ForNode(variable: "items", loopVariable: "item", nodes: [VariableNode(variable: "item")], emptyNodes:[])
|
||||
switch node.render(context) {
|
||||
case .Success(let string):
|
||||
XCTAssertEqual(string, "123")
|
||||
case .Error:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
}
|
||||
XCTAssertEqual(try? node.render(context), "123")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,7 +74,7 @@ class IfNodeTests: NodeTests {
|
||||
]
|
||||
|
||||
let parser = TokenParser(tokens: tokens)
|
||||
assertSuccess(parser.parse()) { nodes in
|
||||
assertSuccess(try parser.parse()) { nodes in
|
||||
let node = nodes.first as! IfNode
|
||||
let trueNode = node.trueNodes.first as! TextNode
|
||||
let falseNode = node.falseNodes.first as! TextNode
|
||||
@@ -138,7 +98,7 @@ class IfNodeTests: NodeTests {
|
||||
]
|
||||
|
||||
let parser = TokenParser(tokens: tokens)
|
||||
assertSuccess(parser.parse()) { nodes in
|
||||
assertSuccess(try parser.parse()) { nodes in
|
||||
let node = nodes.first as! IfNode
|
||||
let trueNode = node.trueNodes.first as! TextNode
|
||||
let falseNode = node.falseNodes.first as! TextNode
|
||||
@@ -158,7 +118,7 @@ class IfNodeTests: NodeTests {
|
||||
]
|
||||
|
||||
let parser = TokenParser(tokens: tokens)
|
||||
assertFailure(parser.parse(), description: "if: `endif` was not found.")
|
||||
assertFailure(try parser.parse(), TemplateSyntaxError("`endif` was not found."))
|
||||
}
|
||||
|
||||
func testParseIfNotWithoutEndIfError() {
|
||||
@@ -167,31 +127,19 @@ class IfNodeTests: NodeTests {
|
||||
]
|
||||
|
||||
let parser = TokenParser(tokens: tokens)
|
||||
assertFailure(parser.parse(), description: "ifnot: `endif` was not found.")
|
||||
assertFailure(try parser.parse(), TemplateSyntaxError("`endif` was not found."))
|
||||
}
|
||||
|
||||
// MARK: Rendering
|
||||
|
||||
func testIfNodeRenderTruth() {
|
||||
let node = IfNode(variable: "items", trueNodes: [TextNode(text: "true")], falseNodes: [TextNode(text: "false")])
|
||||
|
||||
switch node.render(context) {
|
||||
case .Success(let string):
|
||||
XCTAssertEqual(string, "true")
|
||||
case .Error:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
}
|
||||
XCTAssertEqual(try? node.render(context), "true")
|
||||
}
|
||||
|
||||
func testIfNodeRenderFalse() {
|
||||
let node = IfNode(variable: "unknown", trueNodes: [TextNode(text: "true")], falseNodes: [TextNode(text: "false")])
|
||||
|
||||
switch node.render(context) {
|
||||
case .Success(let string):
|
||||
XCTAssertEqual(string, "false")
|
||||
case .Error:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
}
|
||||
XCTAssertEqual(try? node.render(context), "false")
|
||||
}
|
||||
|
||||
}
|
||||
@@ -204,7 +152,7 @@ class NowNodeTests: NodeTests {
|
||||
let tokens = [ Token.Block(value: "now") ]
|
||||
let parser = TokenParser(tokens: tokens)
|
||||
|
||||
assertSuccess(parser.parse()) { nodes in
|
||||
assertSuccess(try parser.parse()) { nodes in
|
||||
let node = nodes.first as! NowNode
|
||||
XCTAssertEqual(nodes.count, 1)
|
||||
XCTAssertEqual(node.format.variable, "\"yyyy-MM-dd 'at' HH:mm\"")
|
||||
@@ -215,7 +163,7 @@ class NowNodeTests: NodeTests {
|
||||
let tokens = [ Token.Block(value: "now \"HH:mm\"") ]
|
||||
let parser = TokenParser(tokens: tokens)
|
||||
|
||||
assertSuccess(parser.parse()) { nodes in
|
||||
assertSuccess(try parser.parse()) { nodes in
|
||||
let node = nodes.first as! NowNode
|
||||
XCTAssertEqual(nodes.count, 1)
|
||||
XCTAssertEqual(node.format.variable, "\"HH:mm\"")
|
||||
@@ -231,13 +179,6 @@ class NowNodeTests: NodeTests {
|
||||
formatter.dateFormat = "yyyy-MM-dd"
|
||||
let date = formatter.stringFromDate(NSDate())
|
||||
|
||||
switch node.render(context) {
|
||||
case .Success(let string):
|
||||
XCTAssertEqual(string, date)
|
||||
case .Error:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
}
|
||||
XCTAssertEqual(try? node.render(context), date)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ class TokenParserTests: XCTestCase {
|
||||
Token.Text(value: "Hello World")
|
||||
])
|
||||
|
||||
assertSuccess(parser.parse()) { nodes in
|
||||
assertSuccess(try parser.parse()) { nodes in
|
||||
let node = nodes.first as! TextNode
|
||||
XCTAssertEqual(nodes.count, 1)
|
||||
XCTAssertEqual(node.text, "Hello World")
|
||||
@@ -20,7 +20,7 @@ class TokenParserTests: XCTestCase {
|
||||
Token.Variable(value: "name")
|
||||
])
|
||||
|
||||
assertSuccess(parser.parse()) { nodes in
|
||||
assertSuccess(try parser.parse()) { nodes in
|
||||
let node = nodes.first as! VariableNode
|
||||
XCTAssertEqual(nodes.count, 1)
|
||||
XCTAssertEqual(node.variable, Variable("name"))
|
||||
@@ -32,7 +32,7 @@ class TokenParserTests: XCTestCase {
|
||||
Token.Comment(value: "Secret stuff!")
|
||||
])
|
||||
|
||||
assertSuccess(parser.parse()) { nodes in
|
||||
assertSuccess(try parser.parse()) { nodes in
|
||||
XCTAssertEqual(nodes.count, 0)
|
||||
}
|
||||
}
|
||||
@@ -42,7 +42,7 @@ class TokenParserTests: XCTestCase {
|
||||
Token.Block(value: "now"),
|
||||
])
|
||||
|
||||
assertSuccess(parser.parse()) { nodes in
|
||||
assertSuccess(try parser.parse()) { nodes in
|
||||
XCTAssertEqual(nodes.count, 1)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,27 +2,27 @@ import Foundation
|
||||
import XCTest
|
||||
import Stencil
|
||||
|
||||
func assertSuccess(result:TokenParser.Results, block:(([Node]) -> ())) {
|
||||
switch result {
|
||||
case .Success(let nodes):
|
||||
block(nodes)
|
||||
case .Error:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
func assertSuccess<T>(@autoclosure closure:() throws -> (T), block:(T -> ())) {
|
||||
do {
|
||||
block(try closure())
|
||||
} catch {
|
||||
XCTFail("Unexpected error \(error)")
|
||||
}
|
||||
}
|
||||
|
||||
func assertFailure(result:TokenParser.Results, description:String) {
|
||||
switch result {
|
||||
case .Success:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
case .Error(let error):
|
||||
XCTAssertEqual("\(error)", description)
|
||||
func assertFailure<T, U : Equatable>(@autoclosure closure:() throws -> (T), _ error:U) {
|
||||
do {
|
||||
try closure()
|
||||
} catch let e as U {
|
||||
XCTAssertEqual(e, error)
|
||||
} catch {
|
||||
XCTFail()
|
||||
}
|
||||
}
|
||||
|
||||
class CustomNode : Node {
|
||||
func render(context:Context) -> Result {
|
||||
return .Success("Hello World")
|
||||
class CustomNode : NodeType {
|
||||
func render(context:Context) throws -> String {
|
||||
return "Hello World"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ class StencilTests: XCTestCase {
|
||||
])
|
||||
|
||||
let template = Template(templateString:templateString)
|
||||
let result = template.render(context)
|
||||
let result = try? template.render(context)
|
||||
|
||||
let fixture = "There are 2 articles.\n" +
|
||||
"\n" +
|
||||
@@ -50,7 +50,7 @@ class StencilTests: XCTestCase {
|
||||
" - Memory Management with ARC by Kyle Fuller.\n" +
|
||||
"\n"
|
||||
|
||||
XCTAssertEqual(result, Result.Success(fixture))
|
||||
XCTAssertEqual(result, fixture)
|
||||
}
|
||||
|
||||
func testCustomTag() {
|
||||
@@ -58,11 +58,10 @@ class StencilTests: XCTestCase {
|
||||
let template = Template(templateString:templateString)
|
||||
|
||||
template.parser.registerTag("custom") { parser, token in
|
||||
return .Success(node:CustomNode())
|
||||
return CustomNode()
|
||||
}
|
||||
|
||||
let result = template.render()
|
||||
XCTAssertEqual(result, Result.Success("Hello World"))
|
||||
XCTAssertEqual(try? template.render(), "Hello World")
|
||||
}
|
||||
|
||||
func testSimpleCustomTag() {
|
||||
@@ -70,10 +69,9 @@ class StencilTests: XCTestCase {
|
||||
let template = Template(templateString:templateString)
|
||||
|
||||
template.parser.registerSimpleTag("custom") { context in
|
||||
return .Success("Hello World")
|
||||
return "Hello World"
|
||||
}
|
||||
|
||||
let result = template.render()
|
||||
XCTAssertEqual(result, Result.Success("Hello World"))
|
||||
XCTAssertEqual(try? template.render(), "Hello World")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,14 +20,14 @@ class IncludeTests: NodeTests {
|
||||
let tokens = [ Token.Block(value: "include") ]
|
||||
let parser = TokenParser(tokens: tokens)
|
||||
|
||||
assertFailure(parser.parse(), description: "include: Tag takes one argument, the template file to be included")
|
||||
assertFailure(try parser.parse(), TemplateSyntaxError("'include' tag takes one argument, the template file to be included"))
|
||||
}
|
||||
|
||||
func testParse() {
|
||||
let tokens = [ Token.Block(value: "include \"test.html\"") ]
|
||||
let parser = TokenParser(tokens: tokens)
|
||||
|
||||
assertSuccess(parser.parse()) { nodes in
|
||||
assertSuccess(try parser.parse()) { nodes in
|
||||
let node = nodes.first as! IncludeNode
|
||||
XCTAssertEqual(nodes.count, 1)
|
||||
XCTAssertEqual(node.templateName, "test.html")
|
||||
@@ -38,38 +38,27 @@ class IncludeTests: NodeTests {
|
||||
|
||||
func testRenderWithoutLoader() {
|
||||
let node = IncludeNode(templateName: "test.html")
|
||||
let result = node.render(Context())
|
||||
|
||||
switch result {
|
||||
case .Success:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
case .Error(let error):
|
||||
do {
|
||||
try node.render(Context())
|
||||
} catch {
|
||||
XCTAssertEqual("\(error)", "Template loader not in context")
|
||||
}
|
||||
}
|
||||
|
||||
func testRenderWithoutTemplateNamed() {
|
||||
let node = IncludeNode(templateName: "unknown.html")
|
||||
let result = node.render(Context(dictionary:["loader":loader]))
|
||||
|
||||
switch result {
|
||||
case .Success:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
case .Error(let error):
|
||||
XCTAssertTrue("\(error)".hasPrefix("Template 'unknown.html' not found"))
|
||||
do {
|
||||
try node.render(Context(dictionary:["loader":loader]))
|
||||
} catch {
|
||||
XCTAssertTrue("\(error)".hasPrefix("'unknown.html' template not found"))
|
||||
}
|
||||
}
|
||||
|
||||
func testRender() {
|
||||
let node = IncludeNode(templateName: "test.html")
|
||||
let result = node.render(Context(dictionary:["loader":loader, "target": "World"]))
|
||||
|
||||
switch result {
|
||||
case .Success(let string):
|
||||
XCTAssertEqual(string, "Hello World!")
|
||||
case .Error(let error):
|
||||
XCTAssert(false, "Unexpected error: \(error)")
|
||||
}
|
||||
let value = try? node.render(Context(dictionary:["loader":loader, "target": "World"]))
|
||||
XCTAssertEqual(value, "Hello World!")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,14 +16,7 @@ class InheritenceTests: NodeTests {
|
||||
func testInheritence() {
|
||||
context = Context(dictionary: ["loader": loader])
|
||||
let template = loader.loadTemplate("child.html")!
|
||||
let result = template.render(context)
|
||||
|
||||
switch result {
|
||||
case .Success(let rendered):
|
||||
XCTAssertEqual(rendered, "Header\nChild")
|
||||
case .Error:
|
||||
XCTAssert(false, "Unexpected error")
|
||||
}
|
||||
XCTAssertEqual(try? template.render(context), "Header\nChild")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,12 +3,10 @@ import XCTest
|
||||
import Stencil
|
||||
|
||||
class TemplateTests: XCTestCase {
|
||||
|
||||
func testTemplate() {
|
||||
let context = Context(dictionary: [ "name": "Kyle" ])
|
||||
let template = Template(templateString: "Hello World")
|
||||
let result = template.render(context)
|
||||
XCTAssertEqual(result, Result.Success("Hello World"))
|
||||
let result = try? template.render(context)
|
||||
XCTAssertEqual(result, "Hello World")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user