diff options
Diffstat (limited to 'Foundation/GTMURITemplateTest.m')
-rw-r--r-- | Foundation/GTMURITemplateTest.m | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/Foundation/GTMURITemplateTest.m b/Foundation/GTMURITemplateTest.m new file mode 100644 index 0000000..ba2c8fb --- /dev/null +++ b/Foundation/GTMURITemplateTest.m @@ -0,0 +1,133 @@ +/* Copyright (c) 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GTMURITemplate.h" + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + +#import "GTMSenTestCase.h" +#import "GTMScriptRunner.h" + +@interface GTMURITemplateTest : GTMTestCase +- (NSDictionary *)loadTestSuitesNamed:(NSString *)testSuitesName; +- (NSDictionary *)parseJSONString:(NSString *)json error:(NSError **)error; +- (void)runTestSuites:(NSDictionary *)testSuites; +@end + +@implementation GTMURITemplateTest + +- (NSDictionary *)parseJSONString:(NSString *)json error:(NSError **)error { + NSDictionary *result = nil; + + // If we ever get a JSON parser in GTM (or the system gets one, next cat?), + // then we can skip this conversion dance. + + NSString *fileName = [NSString stringWithFormat:@"URITemplate_%u.plist", arc4random()]; + NSString *tempOutPath = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName]; + + GTMScriptRunner *runner = [GTMScriptRunner runnerWithPython]; + NSString *command = [NSString stringWithFormat: + @"import Foundation\n" + @"import json\n" + @"str_of_json = \"\"\"%@\"\"\"\n" + @"Foundation.NSDictionary.dictionaryWithDictionary_(json.loads(str_of_json)).writeToFile_atomically_('%@', True)\n", + json, tempOutPath]; + NSString *errStr = nil; + NSString *outStr = [runner run:command standardError:&errStr]; + + STAssertNil(outStr, @"got something on stdout: %@", outStr); + STAssertNil(errStr, @"got something on stderr: %@", errStr); + result = [NSDictionary dictionaryWithContentsOfFile:tempOutPath]; + + [[NSFileManager defaultManager] removeItemAtPath:tempOutPath + error:NULL]; + + return result; +} + +- (NSDictionary *)loadTestSuitesNamed:(NSString *)testSuitesName { + NSBundle *testBundle = [NSBundle bundleForClass:[self class]]; + STAssertNotNil(testBundle, nil); + + NSString *testSuitesPath = [testBundle pathForResource:testSuitesName + ofType:nil]; + STAssertNotNil(testSuitesPath, @"%@ not found", testSuitesName); + + NSError *error = nil; + NSString *testSuitesStr = [NSString stringWithContentsOfFile:testSuitesPath + encoding:NSUTF8StringEncoding + error:&error]; + STAssertNil(error, @"Loading %@, error %@", testSuitesName, error); + STAssertNotNil(testSuitesStr, @"Loading %@", testSuitesName); + + NSDictionary *testSuites = [self parseJSONString:testSuitesStr + error:&error]; + STAssertNil(error, @"Parsing %@, error %@", testSuitesName, error); + STAssertNotNil(testSuites, @"failed to parse"); + + return testSuites; +} + +- (void)runTestSuites:(NSDictionary *)testSuites { + // The file holds a set of named suites... + for (NSString *suiteName in testSuites) { + NSDictionary *suite = [testSuites objectForKey:suiteName]; + // Each suite has variables and test cases... + NSDictionary *vars = [suite objectForKey:@"variables"]; + NSArray *testCases = [suite objectForKey:@"testcases"]; + STAssertTrue([vars count] != 0, @"'%@' no variables?", suiteName); + STAssertTrue([testCases count] != 0, @"'%@' no testcases?", suiteName); + NSUInteger idx = 0; + for (NSArray *testCase in testCases) { + // Each case is an array of the template and value... + STAssertEquals([testCase count], (NSUInteger)2, + @" test index %lu of '%@'", (unsigned long)idx, suiteName); + + NSString *testTemplate = [testCase objectAtIndex:0]; + NSString *expectedResult = [testCase objectAtIndex:1]; + + NSString *result = [GTMURITemplate expandTemplate:testTemplate + values:vars]; + STAssertEqualObjects(result, expectedResult, + @"template was '%@' (index %lu of '%@')", + testTemplate, (unsigned long)idx, suiteName); + ++idx; + } + } +} + +- (void)testRFCSuite { + // All of the examples from the RFC are in the python impl source as json + // test data. A copy is in the GTM tree as GTMURITemplateJSON.txt. The + // original can be found at: + // http://code.google.com/p/uri-templates/source/browse/trunk/testdata.json + NSDictionary *testSuites = [self loadTestSuitesNamed:@"GTMURITemplateRFCTests.json"]; + STAssertNotNil(testSuites, nil); + [self runTestSuites:testSuites]; +} + +- (void)testExtraSuite { + // These are follow up cases not explictly listed in the spec, but does + // as cases to confirm behaviors. The list was sent to the w3c uri list + // for confirmation: + // http://lists.w3.org/Archives/Public/uri/2010Sep/thread.html + NSDictionary *testSuites = [self loadTestSuitesNamed:@"GTMURITemplateExtraTests.json"]; + STAssertNotNil(testSuites, nil); + [self runTestSuites:testSuites]; +} + +@end + +#endif // MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 |