commit
d217808417
42 changed files with 404 additions and 1055 deletions
@ -1,513 +0,0 @@ |
|||||||
// Protocol Buffers - Google's data interchange format |
|
||||||
// Copyright 2008 Google Inc. All rights reserved. |
|
||||||
// https://developers.google.com/protocol-buffers/ |
|
||||||
// |
|
||||||
// Redistribution and use in source and binary forms, with or without |
|
||||||
// modification, are permitted provided that the following conditions are |
|
||||||
// met: |
|
||||||
// |
|
||||||
// * Redistributions of source code must retain the above copyright |
|
||||||
// notice, this list of conditions and the following disclaimer. |
|
||||||
// * Redistributions in binary form must reproduce the above |
|
||||||
// copyright notice, this list of conditions and the following disclaimer |
|
||||||
// in the documentation and/or other materials provided with the |
|
||||||
// distribution. |
|
||||||
// * Neither the name of Google Inc. nor the names of its |
|
||||||
// contributors may be used to endorse or promote products derived from |
|
||||||
// this software without specific prior written permission. |
|
||||||
// |
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
||||||
|
|
||||||
#import <XCTest/XCTest.h> |
|
||||||
|
|
||||||
#import "GPBCodedInputStream_PackagePrivate.h" |
|
||||||
#import "GPBTestUtilities.h" |
|
||||||
|
|
||||||
@interface TestClass : NSObject |
|
||||||
@property(nonatomic, retain) NSString *foo; |
|
||||||
@end |
|
||||||
|
|
||||||
@implementation TestClass |
|
||||||
@synthesize foo; |
|
||||||
@end |
|
||||||
|
|
||||||
@interface GPBStringTests : XCTestCase { |
|
||||||
NSMutableArray *nsStrings_; |
|
||||||
NSMutableArray *gpbStrings_; |
|
||||||
} |
|
||||||
|
|
||||||
@end |
|
||||||
|
|
||||||
@implementation GPBStringTests |
|
||||||
|
|
||||||
- (void)setUp { |
|
||||||
[super setUp]; |
|
||||||
const char *strings[] = { |
|
||||||
"ascii string", |
|
||||||
"non-ascii string \xc3\xa9", // e with acute accent |
|
||||||
"\xe2\x99\xa1", // White Heart |
|
||||||
"mix \xe2\x99\xa4 string", // White Spade |
|
||||||
|
|
||||||
// Decomposed forms from http://www.unicode.org/reports/tr15/ |
|
||||||
// 1.2 Singletons |
|
||||||
"\xe2\x84\xa8 = A\xcc\x8a = \xc3\x85", "\xe2\x84\xa6 = \xce\xa9", |
|
||||||
|
|
||||||
// 1.2 Canonical Composites |
|
||||||
"A\xcc\x8a = \xc3\x85", |
|
||||||
"o\xcc\x82 = \xc3\xb4", |
|
||||||
|
|
||||||
// 1.2 Multiple Combining Marks |
|
||||||
"s\xcc\xa3\xcc\x87 = \xe1\xb9\xa9", |
|
||||||
"\xe1\xb8\x8b\xcc\xa3 = d\xcc\xa3\xcc\x87 = \xe1\xb8\x8d \xcc\x87", |
|
||||||
"q\xcc\x87\xcc\xa3 = q\xcc\xa3\xcc\x87", |
|
||||||
|
|
||||||
// BOM |
|
||||||
"\xEF\xBB\xBF String with BOM", |
|
||||||
"String with \xEF\xBB\xBF in middle", |
|
||||||
"String with end bom \xEF\xBB\xBF", |
|
||||||
"\xEF\xBB\xBF\xe2\x99\xa1", // BOM White Heart |
|
||||||
"\xEF\xBB\xBF\xEF\xBB\xBF String with Two BOM", |
|
||||||
|
|
||||||
// Supplementary Plane |
|
||||||
"\xf0\x9d\x84\x9e", // MUSICAL SYMBOL G CLEF |
|
||||||
|
|
||||||
// Tags |
|
||||||
"\xf3\xa0\x80\x81", // Language Tag |
|
||||||
|
|
||||||
// Variation Selectors |
|
||||||
"\xf3\xa0\x84\x80", // VARIATION SELECTOR-17 |
|
||||||
|
|
||||||
// Specials |
|
||||||
"\xef\xbb\xbf\xef\xbf\xbd\xef\xbf\xbf", |
|
||||||
|
|
||||||
// Left To Right/Right To Left |
|
||||||
// http://unicode.org/reports/tr9/ |
|
||||||
|
|
||||||
// Hello! <RTL marker>!Merhaba<LTR marker> |
|
||||||
"Hello! \xE2\x80\x8F!\xd9\x85\xd8\xb1\xd8\xad\xd8\xa8\xd8\xa7\xE2\x80\x8E", |
|
||||||
|
|
||||||
"\xE2\x80\x8E LTR At Start", |
|
||||||
"LTR At End\xE2\x80\x8E", |
|
||||||
"\xE2\x80\x8F RTL At Start", |
|
||||||
"RTL At End\xE2\x80\x8F", |
|
||||||
"\xE2\x80\x8E\xE2\x80\x8E Double LTR \xE2\x80\x8E\xE2\x80\x8E", |
|
||||||
"\xE2\x80\x8F\xE2\x80\x8F Double RTL \xE2\x80\x8F\xE2\x80\x8F", |
|
||||||
"\xE2\x80\x8F\xE2\x80\x8E LTR-RTL LTR-RTL \xE2\x80\x8E\xE2\x80\x8F", |
|
||||||
}; |
|
||||||
size_t stringsSize = GPBARRAYSIZE(strings); |
|
||||||
size_t numberUnicodeStrings = 17375; |
|
||||||
nsStrings_ = [[NSMutableArray alloc] |
|
||||||
initWithCapacity:stringsSize + numberUnicodeStrings]; |
|
||||||
gpbStrings_ = [[NSMutableArray alloc] |
|
||||||
initWithCapacity:stringsSize + numberUnicodeStrings]; |
|
||||||
for (size_t i = 0; i < stringsSize; ++i) { |
|
||||||
size_t length = strlen(strings[i]); |
|
||||||
NSString *nsString = [[NSString alloc] initWithBytes:strings[i] |
|
||||||
length:length |
|
||||||
encoding:NSUTF8StringEncoding]; |
|
||||||
[nsStrings_ addObject:nsString]; |
|
||||||
[nsString release]; |
|
||||||
GPBString *gpbString = GPBCreateGPBStringWithUTF8(strings[i], length); |
|
||||||
[gpbStrings_ addObject:gpbString]; |
|
||||||
[gpbString release]; |
|
||||||
} |
|
||||||
|
|
||||||
// Generate all UTF8 characters in a variety of strings |
|
||||||
// UTF8-1 - 1 Byte UTF 8 chars |
|
||||||
int length = 0x7F + 1; |
|
||||||
char *buffer = (char *)calloc(length, 1); |
|
||||||
for (int i = 0; i < length; ++i) { |
|
||||||
buffer[i] = (char)i; |
|
||||||
} |
|
||||||
NSString *nsString = [[NSString alloc] initWithBytes:buffer |
|
||||||
length:length |
|
||||||
encoding:NSUTF8StringEncoding]; |
|
||||||
[nsStrings_ addObject:nsString]; |
|
||||||
[nsString release]; |
|
||||||
GPBString *gpbString = GPBCreateGPBStringWithUTF8(buffer, length); |
|
||||||
[gpbStrings_ addObject:gpbString]; |
|
||||||
[gpbString release]; |
|
||||||
|
|
||||||
// UTF8-2 - 2 Byte UTF 8 chars |
|
||||||
int pointLength = 0xbf - 0x80 + 1; |
|
||||||
length = pointLength * 2; |
|
||||||
buffer = (char *)calloc(length, 1); |
|
||||||
for (int i = 0xc2; i <= 0xdf; ++i) { |
|
||||||
char *bufferPtr = buffer; |
|
||||||
for (int j = 0x80; j <= 0xbf; ++j) { |
|
||||||
(*bufferPtr++) = (char)i; |
|
||||||
(*bufferPtr++) = (char)j; |
|
||||||
} |
|
||||||
nsString = [[NSString alloc] initWithBytes:buffer |
|
||||||
length:length |
|
||||||
encoding:NSUTF8StringEncoding]; |
|
||||||
[nsStrings_ addObject:nsString]; |
|
||||||
[nsString release]; |
|
||||||
gpbString = GPBCreateGPBStringWithUTF8(buffer, length); |
|
||||||
[gpbStrings_ addObject:gpbString]; |
|
||||||
[gpbString release]; |
|
||||||
} |
|
||||||
free(buffer); |
|
||||||
|
|
||||||
// UTF8-3 - 3 Byte UTF 8 chars |
|
||||||
length = pointLength * 3; |
|
||||||
buffer = (char *)calloc(length, 1); |
|
||||||
for (int i = 0xa0; i <= 0xbf; ++i) { |
|
||||||
char *bufferPtr = buffer; |
|
||||||
for (int j = 0x80; j <= 0xbf; ++j) { |
|
||||||
(*bufferPtr++) = (char)0xE0; |
|
||||||
(*bufferPtr++) = (char)i; |
|
||||||
(*bufferPtr++) = (char)j; |
|
||||||
} |
|
||||||
nsString = [[NSString alloc] initWithBytes:buffer |
|
||||||
length:length |
|
||||||
encoding:NSUTF8StringEncoding]; |
|
||||||
[nsStrings_ addObject:nsString]; |
|
||||||
[nsString release]; |
|
||||||
gpbString = GPBCreateGPBStringWithUTF8(buffer, length); |
|
||||||
[gpbStrings_ addObject:gpbString]; |
|
||||||
[gpbString release]; |
|
||||||
} |
|
||||||
for (int i = 0xe1; i <= 0xec; ++i) { |
|
||||||
for (int j = 0x80; j <= 0xbf; ++j) { |
|
||||||
char *bufferPtr = buffer; |
|
||||||
for (int k = 0x80; k <= 0xbf; ++k) { |
|
||||||
(*bufferPtr++) = (char)i; |
|
||||||
(*bufferPtr++) = (char)j; |
|
||||||
(*bufferPtr++) = (char)k; |
|
||||||
} |
|
||||||
nsString = [[NSString alloc] initWithBytes:buffer |
|
||||||
length:length |
|
||||||
encoding:NSUTF8StringEncoding]; |
|
||||||
[nsStrings_ addObject:nsString]; |
|
||||||
[nsString release]; |
|
||||||
gpbString = GPBCreateGPBStringWithUTF8(buffer, length); |
|
||||||
[gpbStrings_ addObject:gpbString]; |
|
||||||
[gpbString release]; |
|
||||||
} |
|
||||||
} |
|
||||||
for (int i = 0x80; i <= 0x9f; ++i) { |
|
||||||
char *bufferPtr = buffer; |
|
||||||
for (int j = 0x80; j <= 0xbf; ++j) { |
|
||||||
(*bufferPtr++) = (char)0xED; |
|
||||||
(*bufferPtr++) = (char)i; |
|
||||||
(*bufferPtr++) = (char)j; |
|
||||||
} |
|
||||||
nsString = [[NSString alloc] initWithBytes:buffer |
|
||||||
length:length |
|
||||||
encoding:NSUTF8StringEncoding]; |
|
||||||
[nsStrings_ addObject:nsString]; |
|
||||||
[nsString release]; |
|
||||||
gpbString = GPBCreateGPBStringWithUTF8(buffer, length); |
|
||||||
[gpbStrings_ addObject:gpbString]; |
|
||||||
[gpbString release]; |
|
||||||
} |
|
||||||
for (int i = 0xee; i <= 0xef; ++i) { |
|
||||||
for (int j = 0x80; j <= 0xbf; ++j) { |
|
||||||
char *bufferPtr = buffer; |
|
||||||
for (int k = 0x80; k <= 0xbf; ++k) { |
|
||||||
(*bufferPtr++) = (char)i; |
|
||||||
(*bufferPtr++) = (char)j; |
|
||||||
(*bufferPtr++) = (char)k; |
|
||||||
} |
|
||||||
nsString = [[NSString alloc] initWithBytes:buffer |
|
||||||
length:length |
|
||||||
encoding:NSUTF8StringEncoding]; |
|
||||||
[nsStrings_ addObject:nsString]; |
|
||||||
[nsString release]; |
|
||||||
gpbString = GPBCreateGPBStringWithUTF8(buffer, length); |
|
||||||
[gpbStrings_ addObject:gpbString]; |
|
||||||
[gpbString release]; |
|
||||||
} |
|
||||||
} |
|
||||||
free(buffer); |
|
||||||
|
|
||||||
// UTF8-4 - 4 Byte UTF 8 chars |
|
||||||
length = pointLength * 4; |
|
||||||
buffer = (char *)calloc(length, 1); |
|
||||||
for (int i = 0x90; i <= 0xbf; ++i) { |
|
||||||
for (int j = 0x80; j <= 0xbf; ++j) { |
|
||||||
char *bufferPtr = buffer; |
|
||||||
for (int k = 0x80; k <= 0xbf; ++k) { |
|
||||||
(*bufferPtr++) = (char)0xF0; |
|
||||||
(*bufferPtr++) = (char)i; |
|
||||||
(*bufferPtr++) = (char)j; |
|
||||||
(*bufferPtr++) = (char)k; |
|
||||||
} |
|
||||||
nsString = [[NSString alloc] initWithBytes:buffer |
|
||||||
length:length |
|
||||||
encoding:NSUTF8StringEncoding]; |
|
||||||
[nsStrings_ addObject:nsString]; |
|
||||||
[nsString release]; |
|
||||||
gpbString = GPBCreateGPBStringWithUTF8(buffer, length); |
|
||||||
[gpbStrings_ addObject:gpbString]; |
|
||||||
[gpbString release]; |
|
||||||
} |
|
||||||
} |
|
||||||
for (int i = 0xf1; i <= 0xf3; ++i) { |
|
||||||
for (int j = 0x80; j <= 0xbf; ++j) { |
|
||||||
for (int k = 0x80; k <= 0xbf; ++k) { |
|
||||||
char *bufferPtr = buffer; |
|
||||||
for (int m = 0x80; m <= 0xbf; ++m) { |
|
||||||
(*bufferPtr++) = (char)i; |
|
||||||
(*bufferPtr++) = (char)j; |
|
||||||
(*bufferPtr++) = (char)k; |
|
||||||
(*bufferPtr++) = (char)m; |
|
||||||
} |
|
||||||
nsString = [[NSString alloc] initWithBytes:buffer |
|
||||||
length:length |
|
||||||
encoding:NSUTF8StringEncoding]; |
|
||||||
[nsStrings_ addObject:nsString]; |
|
||||||
[nsString release]; |
|
||||||
gpbString = GPBCreateGPBStringWithUTF8(buffer, length); |
|
||||||
[gpbStrings_ addObject:gpbString]; |
|
||||||
[gpbString release]; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
for (int i = 0x80; i <= 0x8f; ++i) { |
|
||||||
for (int j = 0x80; j <= 0xbf; ++j) { |
|
||||||
char *bufferPtr = buffer; |
|
||||||
for (int k = 0x80; k <= 0xbf; ++k) { |
|
||||||
(*bufferPtr++) = (char)0xF4; |
|
||||||
(*bufferPtr++) = (char)i; |
|
||||||
(*bufferPtr++) = (char)j; |
|
||||||
(*bufferPtr++) = (char)k; |
|
||||||
} |
|
||||||
nsString = [[NSString alloc] initWithBytes:buffer |
|
||||||
length:length |
|
||||||
encoding:NSUTF8StringEncoding]; |
|
||||||
[nsStrings_ addObject:nsString]; |
|
||||||
[nsString release]; |
|
||||||
gpbString = GPBCreateGPBStringWithUTF8(buffer, length); |
|
||||||
[gpbStrings_ addObject:gpbString]; |
|
||||||
[gpbString release]; |
|
||||||
} |
|
||||||
} |
|
||||||
free(buffer); |
|
||||||
} |
|
||||||
|
|
||||||
- (void)tearDown { |
|
||||||
[nsStrings_ release]; |
|
||||||
[gpbStrings_ release]; |
|
||||||
[super tearDown]; |
|
||||||
} |
|
||||||
|
|
||||||
- (void)testLength { |
|
||||||
size_t i = 0; |
|
||||||
for (NSString *nsString in nsStrings_) { |
|
||||||
GPBString *gpbString = gpbStrings_[i]; |
|
||||||
XCTAssertEqual([nsString length], [gpbString length], @"%@ %@", nsString, |
|
||||||
gpbString); |
|
||||||
++i; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
- (void)testLengthOfBytesUsingEncoding { |
|
||||||
NSStringEncoding encodings[] = { |
|
||||||
NSUTF8StringEncoding, |
|
||||||
NSASCIIStringEncoding, |
|
||||||
NSISOLatin1StringEncoding, |
|
||||||
NSMacOSRomanStringEncoding, |
|
||||||
NSUTF16StringEncoding, |
|
||||||
NSUTF32StringEncoding, |
|
||||||
}; |
|
||||||
|
|
||||||
for (size_t j = 0; j < GPBARRAYSIZE(encodings); ++j) { |
|
||||||
NSStringEncoding testEncoding = encodings[j]; |
|
||||||
size_t i = 0; |
|
||||||
for (NSString *nsString in nsStrings_) { |
|
||||||
GPBString *gpbString = gpbStrings_[i]; |
|
||||||
XCTAssertEqual([nsString lengthOfBytesUsingEncoding:testEncoding], |
|
||||||
[gpbString lengthOfBytesUsingEncoding:testEncoding], |
|
||||||
@"%@ %@", nsString, gpbString); |
|
||||||
++i; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
- (void)testHash { |
|
||||||
size_t i = 0; |
|
||||||
for (NSString *nsString in nsStrings_) { |
|
||||||
GPBString *gpbString = gpbStrings_[i]; |
|
||||||
XCTAssertEqual([nsString hash], [gpbString hash], @"%@ %@", nsString, |
|
||||||
gpbString); |
|
||||||
++i; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
- (void)testEquality { |
|
||||||
size_t i = 0; |
|
||||||
for (NSString *nsString in nsStrings_) { |
|
||||||
GPBString *gpbString = gpbStrings_[i]; |
|
||||||
XCTAssertEqualObjects(nsString, gpbString); |
|
||||||
++i; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
- (void)testCharacterAtIndex { |
|
||||||
size_t i = 0; |
|
||||||
for (NSString *nsString in nsStrings_) { |
|
||||||
GPBString *gpbString = gpbStrings_[i]; |
|
||||||
NSUInteger length = [nsString length]; |
|
||||||
for (size_t j = 0; j < length; ++j) { |
|
||||||
unichar nsChar = [nsString characterAtIndex:j]; |
|
||||||
unichar pbChar = [gpbString characterAtIndex:j]; |
|
||||||
XCTAssertEqual(nsChar, pbChar, @"%@ %@ %zu", nsString, gpbString, j); |
|
||||||
} |
|
||||||
++i; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
- (void)testCopy { |
|
||||||
size_t i = 0; |
|
||||||
for (NSString *nsString in nsStrings_) { |
|
||||||
GPBString *gpbString = [[gpbStrings_[i] copy] autorelease]; |
|
||||||
XCTAssertEqualObjects(nsString, gpbString); |
|
||||||
++i; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
- (void)testMutableCopy { |
|
||||||
size_t i = 0; |
|
||||||
for (NSString *nsString in nsStrings_) { |
|
||||||
GPBString *gpbString = [[gpbStrings_[i] mutableCopy] autorelease]; |
|
||||||
XCTAssertEqualObjects(nsString, gpbString); |
|
||||||
++i; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
- (void)testGetBytes { |
|
||||||
// Do an attempt at a reasonably exhaustive test of get bytes. |
|
||||||
// Get bytes with options other than 0 should always fall through to Apple |
|
||||||
// code so we don't bother testing that path. |
|
||||||
size_t i = 0; |
|
||||||
char pbBuffer[256]; |
|
||||||
char nsBuffer[256]; |
|
||||||
int count = 0; |
|
||||||
for (NSString *nsString in nsStrings_) { |
|
||||||
GPBString *gpbString = gpbStrings_[i]; |
|
||||||
for (int j = 0; j < 100; ++j) { |
|
||||||
// [NSString getBytes:maxLength:usedLength:encoding:options:range:remainingRange] |
|
||||||
// does not return reliable results if the maxLength argument is 0, |
|
||||||
// or range is 0,0. |
|
||||||
// Radar 16385183 |
|
||||||
NSUInteger length = [nsString length]; |
|
||||||
NSUInteger maxBufferCount = (arc4random() % (length + 3)) + 1; |
|
||||||
NSUInteger rangeStart = arc4random() % length; |
|
||||||
NSUInteger rangeLength = arc4random() % (length - rangeStart); |
|
||||||
|
|
||||||
NSRange range = NSMakeRange(rangeStart, rangeLength); |
|
||||||
|
|
||||||
NSStringEncoding encodings[] = { |
|
||||||
NSASCIIStringEncoding, |
|
||||||
NSUTF8StringEncoding, |
|
||||||
NSUTF16StringEncoding, |
|
||||||
}; |
|
||||||
|
|
||||||
for (size_t k = 0; k < GPBARRAYSIZE(encodings); ++k) { |
|
||||||
NSStringEncoding encoding = encodings[k]; |
|
||||||
NSUInteger pbUsedBufferCount = 0; |
|
||||||
NSUInteger nsUsedBufferCount = 0; |
|
||||||
NSRange pbLeftOver = NSMakeRange(0, 0); |
|
||||||
NSRange nsLeftOver = NSMakeRange(0, 0); |
|
||||||
|
|
||||||
BOOL pbGotBytes = [gpbString getBytes:pbBuffer |
|
||||||
maxLength:maxBufferCount |
|
||||||
usedLength:&pbUsedBufferCount |
|
||||||
encoding:encoding |
|
||||||
options:0 |
|
||||||
range:range |
|
||||||
remainingRange:&pbLeftOver]; |
|
||||||
BOOL nsGotBytes = [nsString getBytes:nsBuffer |
|
||||||
maxLength:maxBufferCount |
|
||||||
usedLength:&nsUsedBufferCount |
|
||||||
encoding:encoding |
|
||||||
options:0 |
|
||||||
range:range |
|
||||||
remainingRange:&nsLeftOver]; |
|
||||||
XCTAssertEqual( |
|
||||||
(bool)pbGotBytes, (bool)nsGotBytes, |
|
||||||
@"PB %d '%@' vs '%@' Encoding:%tu MaxLength: %tu Range: %@ " |
|
||||||
@"Used: %tu, %tu LeftOver %@, %@)", |
|
||||||
count, gpbString, nsString, encoding, maxBufferCount, |
|
||||||
NSStringFromRange(range), pbUsedBufferCount, nsUsedBufferCount, |
|
||||||
NSStringFromRange(pbLeftOver), NSStringFromRange(nsLeftOver)); |
|
||||||
XCTAssertEqual( |
|
||||||
pbUsedBufferCount, nsUsedBufferCount, |
|
||||||
@"PB %d '%@' vs '%@' Encoding:%tu MaxLength: %tu Range: %@ " |
|
||||||
@"Used: %tu, %tu LeftOver %@, %@)", |
|
||||||
count, gpbString, nsString, encoding, maxBufferCount, |
|
||||||
NSStringFromRange(range), pbUsedBufferCount, nsUsedBufferCount, |
|
||||||
NSStringFromRange(pbLeftOver), NSStringFromRange(nsLeftOver)); |
|
||||||
XCTAssertEqual( |
|
||||||
pbLeftOver.location, nsLeftOver.location, |
|
||||||
@"PB %d '%@' vs '%@' Encoding:%tu MaxLength: %tu Range: %@ " |
|
||||||
@"Used: %tu, %tu LeftOver %@, %@)", |
|
||||||
count, gpbString, nsString, encoding, maxBufferCount, |
|
||||||
NSStringFromRange(range), pbUsedBufferCount, nsUsedBufferCount, |
|
||||||
NSStringFromRange(pbLeftOver), NSStringFromRange(nsLeftOver)); |
|
||||||
XCTAssertEqual( |
|
||||||
pbLeftOver.length, nsLeftOver.length, |
|
||||||
@"PB %d '%@' vs '%@' Encoding:%tu MaxLength: %tu Range: %@ " |
|
||||||
@"Used: %tu, %tu LeftOver %@, %@)", |
|
||||||
count, gpbString, nsString, encoding, maxBufferCount, |
|
||||||
NSStringFromRange(range), pbUsedBufferCount, nsUsedBufferCount, |
|
||||||
NSStringFromRange(pbLeftOver), NSStringFromRange(nsLeftOver)); |
|
||||||
++count; |
|
||||||
} |
|
||||||
} |
|
||||||
++i; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
- (void)testLengthAndGetBytes { |
|
||||||
// This test exists as an attempt to ferret out a bug. |
|
||||||
// http://b/13516532 |
|
||||||
size_t i = 0; |
|
||||||
char pbBuffer[256]; |
|
||||||
char nsBuffer[256]; |
|
||||||
for (NSString *nsString in nsStrings_) { |
|
||||||
GPBString *gpbString = gpbStrings_[i++]; |
|
||||||
NSUInteger nsLength = |
|
||||||
[nsString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; |
|
||||||
NSUInteger pbLength = |
|
||||||
[gpbString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; |
|
||||||
XCTAssertEqual(nsLength, pbLength, @"%@ %@", nsString, gpbString); |
|
||||||
NSUInteger pbUsedBufferCount = 0; |
|
||||||
NSUInteger nsUsedBufferCount = 0; |
|
||||||
NSRange pbLeftOver = NSMakeRange(0, 0); |
|
||||||
NSRange nsLeftOver = NSMakeRange(0, 0); |
|
||||||
NSRange range = NSMakeRange(0, [gpbString length]); |
|
||||||
BOOL pbGotBytes = [gpbString getBytes:pbBuffer |
|
||||||
maxLength:sizeof(pbBuffer) |
|
||||||
usedLength:&pbUsedBufferCount |
|
||||||
encoding:NSUTF8StringEncoding |
|
||||||
options:0 |
|
||||||
range:range |
|
||||||
remainingRange:&pbLeftOver]; |
|
||||||
BOOL nsGotBytes = [nsString getBytes:nsBuffer |
|
||||||
maxLength:sizeof(nsBuffer) |
|
||||||
usedLength:&nsUsedBufferCount |
|
||||||
encoding:NSUTF8StringEncoding |
|
||||||
options:0 |
|
||||||
range:range |
|
||||||
remainingRange:&nsLeftOver]; |
|
||||||
XCTAssertTrue(pbGotBytes, @"%@", gpbString); |
|
||||||
XCTAssertTrue(nsGotBytes, @"%@", nsString); |
|
||||||
XCTAssertEqual(pbUsedBufferCount, pbLength, @"%@", gpbString); |
|
||||||
XCTAssertEqual(nsUsedBufferCount, nsLength, @"%@", nsString); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@end |
|
Loading…
Reference in new issue