| // |
| // GTMNSDictionary+URLArgumentsTest.m |
| // |
| // Copyright 2006-2008 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 "GTMSenTestCase.h" |
| #import "GTMNSDictionary+URLArguments.h" |
| #import "GTMDefines.h" |
| |
| #pragma clang diagnostic push |
| // Ignore all of the deprecation warnings for GTMNSDictionary+URLArguments |
| #pragma clang diagnostic ignored "-Wdeprecated-declarations" |
| |
| @interface GTMNSDictionary_URLArgumentsTest : GTMTestCase |
| @end |
| |
| @implementation GTMNSDictionary_URLArgumentsTest |
| |
| - (void)testFromArgumentsString { |
| XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@""], |
| [NSDictionary dictionary], |
| @"- empty arguments string should give an empty dictionary"); |
| XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a"], |
| [NSDictionary dictionaryWithObject:@"" forKey:@"a"], |
| @"- missing '=' should result in an empty string value"); |
| XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a="], |
| [NSDictionary dictionaryWithObject:@"" forKey:@"a"], |
| @"- no value"); |
| XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"&a=1"], |
| [NSDictionary dictionaryWithObject:@"1" forKey:@"a"], |
| @"- empty segment should be skipped"); |
| XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"abc=123"], |
| [NSDictionary dictionaryWithObject:@"123" forKey:@"abc"], |
| @"- simple one-pair dictionary should work"); |
| XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a=1&a=2&a=3"], |
| [NSDictionary dictionaryWithObject:@"1" forKey:@"a"], |
| @"- only first occurrence of a key is returned"); |
| NSString* complex = @"a%2Bb=specialkey&complex=1%2B1%21%3D3%20%26%202%2A6%2F3%3D4&c"; |
| NSDictionary* result = [NSDictionary dictionaryWithObjectsAndKeys: |
| @"1+1!=3 & 2*6/3=4", @"complex", |
| @"specialkey", @"a+b", |
| @"", @"c", |
| nil]; |
| XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:complex], |
| result, |
| @"- keys and values should be unescaped correctly"); |
| XCTAssertEqualObjects([NSDictionary gtm_dictionaryWithHttpArgumentsString:@"a=%FC"], |
| [NSDictionary dictionaryWithObject:@"" forKey:@"a"], |
| @"- invalid UTF8 characters result in an empty value, not a crash"); |
| } |
| |
| - (void)testArgumentsString { |
| XCTAssertEqualObjects([[NSDictionary dictionary] gtm_httpArgumentsString], @"", |
| @"- empty dictionary should give an empty string"); |
| XCTAssertEqualObjects([[NSDictionary dictionaryWithObject:@"123" forKey:@"abc"] gtm_httpArgumentsString], |
| @"abc=123", |
| @"- simple one-pair dictionary should work"); |
| NSDictionary* arguments = [NSDictionary dictionaryWithObjectsAndKeys: |
| @"1+1!=3 & 2*6/3=4", @"complex", |
| @"specialkey", @"a+b", |
| nil]; |
| NSString* argumentString = [arguments gtm_httpArgumentsString]; |
| // check for individual pieces since order is not guaranteed |
| NSString* component1 = @"a%2Bb=specialkey"; |
| NSString* component2 = @"complex=1%2B1%21%3D3%20%26%202%2A6%2F3%3D4"; |
| XCTAssertNotEqual([argumentString rangeOfString:component1].location, (NSUInteger)NSNotFound, |
| @"- '%@' not found in '%@'", component1, argumentString); |
| XCTAssertNotEqual([argumentString rangeOfString:component2].location, (NSUInteger)NSNotFound, |
| @"- '%@' not found in '%@'", component2, argumentString); |
| XCTAssertNotEqual([argumentString rangeOfString:@"&"].location, (NSUInteger)NSNotFound, |
| @"- special characters should be escaped"); |
| XCTAssertNotEqual([argumentString characterAtIndex:0], (unichar)'&', |
| @"- there should be no & at the beginning of the string"); |
| XCTAssertNotEqual([argumentString characterAtIndex:([argumentString length] - 1)], (unichar)'&', |
| @"- there should be no & at the end of the string"); |
| } |
| |
| @end |
| |
| #pragma clang diagnostic pop |