/** * The examples provided by Facebook are for non-commercial testing and * evaluation purposes only. * * Facebook reserves all rights not expressly granted. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #import #import "RCTUtils.h" @interface RCTJSONTests : XCTestCase @end @implementation RCTJSONTests - (void)testEncodingObject { NSDictionary *obj = @{@"foo": @"bar"}; NSString *json = @"{\"foo\":\"bar\"}"; XCTAssertEqualObjects(json, RCTJSONStringify(obj, NULL)); } - (void)testEncodingArray { NSArray *array = @[@"foo", @"bar"]; NSString *json = @"[\"foo\",\"bar\"]"; XCTAssertEqualObjects(json, RCTJSONStringify(array, NULL)); } - (void)testEncodingString { NSString *text = @"Hello\nWorld"; NSString *json = @"\"Hello\\nWorld\""; XCTAssertEqualObjects(json, RCTJSONStringify(text, NULL)); } - (void)testEncodingNSError { NSError *underlyingError = [NSError errorWithDomain:@"underlyingDomain" code:421 userInfo:nil]; NSError *err = [NSError errorWithDomain:@"domain" code:68 userInfo:@{@"NSUnderlyingError": underlyingError}]; // An assertion on the full object would be too brittle since it contains an iOS stack trace // so we are relying on the behavior of RCTJSONParse, which is tested below. NSDictionary *jsonObject = RCTJSErrorFromNSError(err); NSString *jsonString = RCTJSONStringify(jsonObject, NULL); NSDictionary *json = RCTJSONParse(jsonString, NULL); XCTAssertEqualObjects(json[@"code"], @"EDOMAIN68"); XCTAssertEqualObjects(json[@"message"], @"The operation couldn’t be completed. (domain error 68.)"); XCTAssertEqualObjects(json[@"domain"], @"domain"); XCTAssertEqualObjects(json[@"userInfo"][@"NSUnderlyingError"][@"code"], @"421"); XCTAssertEqualObjects(json[@"userInfo"][@"NSUnderlyingError"][@"message"], @"underlying error"); XCTAssertEqualObjects(json[@"userInfo"][@"NSUnderlyingError"][@"domain"], @"underlyingDomain"); } - (void)testDecodingObject { NSDictionary *obj = @{@"foo": @"bar"}; NSString *json = @"{\"foo\":\"bar\"}"; XCTAssertEqualObjects(obj, RCTJSONParse(json, NULL)); } - (void)testDecodingArray { NSArray *array = @[@"foo", @"bar"]; NSString *json = @"[\"foo\",\"bar\"]"; XCTAssertEqualObjects(array, RCTJSONParse(json, NULL)); } - (void)testDecodingString { NSString *text = @"Hello\nWorld"; NSString *json = @"\"Hello\\nWorld\""; XCTAssertEqualObjects(text, RCTJSONParse(json, NULL)); } - (void)testDecodingMutableArray { NSString *json = @"[1,2,3]"; NSMutableArray *array = RCTJSONParseMutable(json, NULL); XCTAssertNoThrow([array addObject:@4]); XCTAssertEqualObjects(array, (@[@1, @2, @3, @4])); } - (void)testLeadingWhitespace { NSDictionary *obj = @{@"foo": @"bar"}; NSString *json = @" \r\n\t{\"foo\":\"bar\"}"; XCTAssertEqualObjects(obj, RCTJSONParse(json, NULL)); } - (void)testNotJSONSerializable { NSDictionary *obj = @{@"foo": [NSDate date]}; NSString *json = @"{\"foo\":null}"; XCTAssertEqualObjects(json, RCTJSONStringify(obj, NULL)); } - (void)testNaN { NSDictionary *obj = @{@"foo": @(NAN)}; NSString *json = @"{\"foo\":0}"; XCTAssertEqualObjects(json, RCTJSONStringify(obj, NULL)); } - (void)testNotUTF8Convertible { //see https://gist.github.com/0xced/56035d2f57254cf518b5 NSString *string = [[NSString alloc] initWithBytes:"\xd8\x00" length:2 encoding:NSUTF16StringEncoding]; NSDictionary *obj = @{@"foo": string}; NSString *json = @"{\"foo\":null}"; XCTAssertEqualObjects(json, RCTJSONStringify(obj, NULL)); } - (void)testErrorPointer { NSDictionary *obj = @{@"foo": [NSDate date]}; NSError *error; XCTAssertNil(RCTJSONStringify(obj, &error)); XCTAssertNotNil(error); } @end