I have a XCTestCase scenario using the following methodology:
- (void)testScript {
NSError* error = nil;
for (NSURL *scriptURL in [self findScriptFiles]) {
// Read the entire file.
NSString *text = [NSString stringWithContentsOfURL:scriptURL
encoding:NSUTF8StringEncoding error:&error];
// Test each line.
[text enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {
XCTAssertTrue([self runInstruction:line]);
}];
}
}
This works, but I don't like it that all error messages are placed in the testScript source code, whereas they should really be placed inline in the parsed script.
I did a bit of digging in the XCTestCase framework headers and found the solution, using recordFailureWithDescription:inFile:atLine:expected:
- (void)testScript {
NSError* error = nil;
for (NSURL *scriptURL in [self findScriptFiles]) {
// Read the entire file.
NSString *text = [NSString stringWithContentsOfURL:scriptURL
encoding:NSUTF8StringEncoding error:&error];
__block NSUInteger lineNum = 0;
// Test each line.
[text enumerateLinesUsingBlock:^(NSString *line, BOOL *stop) {
lineNum++;
if ([self runInstruction:line] == NO) {
// Place the error marker in the parsed file!
[self recordFailureWithDescription:@"Instruction failed"
inFile:[self sourcePathForURL:scriptURL]
atLine:lineNum
expected:YES];
}
}];
}
}
NB. The scriptURL points to a file within the resources folder of the test target, i.e. not to the original script file in my Xcode project. I therefore need to locate the original script file, for instance relative to the current source file (whose name can be obtained through the __FILE__ preprocessor macro).