aboutsummaryrefslogtreecommitdiffstats
path: root/UnitTests
diff options
context:
space:
mode:
Diffstat (limited to 'UnitTests')
-rw-r--r--UnitTests/SPDataAdditionsTests.m141
-rw-r--r--UnitTests/SPDatabaseActionTest.m10
-rw-r--r--UnitTests/SPMenuAdditionsTests.m6
-rw-r--r--UnitTests/SPMutableArrayAdditionsTests.m6
-rw-r--r--UnitTests/SPParserUtilsTest.m22
-rw-r--r--UnitTests/SPStringAdditionsTests.m77
-rw-r--r--UnitTests/SPTableCopyTest.m75
-rw-r--r--UnitTests/SPTableFilterParserTest.m10
8 files changed, 241 insertions, 106 deletions
diff --git a/UnitTests/SPDataAdditionsTests.m b/UnitTests/SPDataAdditionsTests.m
index 812eb45d..4769e499 100644
--- a/UnitTests/SPDataAdditionsTests.m
+++ b/UnitTests/SPDataAdditionsTests.m
@@ -29,17 +29,18 @@
// More info at <https://github.com/sequelpro/sequelpro>
#import <Cocoa/Cocoa.h>
-#import <SenTestingKit/SenTestingKit.h>
+#import <XCTest/XCTest.h>
#import "SPDataAdditions.h"
#import <errno.h>
-@interface SPDataAdditionsTests : SenTestCase
+@interface SPDataAdditionsTests : XCTestCase
- (void)testSha1Hash;
- (void)testDataEncryptedWithPassword;
- (void)testDataEncryptedWithKeyIV;
- (void)testDataDecryptedWithPassword;
- (void)testDataDecryptedWithKey;
+- (void)testEnumerateLinesBreakingAt_withBlock;
@end
@@ -52,7 +53,7 @@
NSString *input = @"Hello World!";
unsigned char bytes[] = {0x2e,0xf7,0xbd,0xe6,0x08,0xce,0x54,0x04,0xe9,0x7d,0x5f,0x04,0x2f,0x95,0xf8,0x9f,0x1c,0x23,0x28,0x71};
- STAssertTrue(memcmp([[[input dataUsingEncoding:NSUTF8StringEncoding] sha1Hash] bytes], bytes, 20) == 0, @"SHA1 simple hash from ASCII text");
+ XCTAssertTrue(memcmp([[[input dataUsingEncoding:NSUTF8StringEncoding] sha1Hash] bytes], bytes, 20) == 0, @"SHA1 simple hash from ASCII text");
}
// 16MB of all 8bit values
{
@@ -64,14 +65,14 @@
NSData *input = [NSData dataWithBytesNoCopy:buf length:bufSz];
NSString *result = @"25E05EB8E9E2B06036DF4026630FE01A19BF0F16";
- STAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash from full ASCII range");
+ XCTAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash from full ASCII range");
}
// empty hash
{
NSData *input = [NSData data];
NSString *result = @"DA39A3EE5E6B4B0D3255BFEF95601890AFD80709";
- STAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash from empty data");
+ XCTAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash from empty data");
}
// test with > 4GB data (other code path)
// HFS+ does not support sparse files, so enable this one only if you have enough disk space.
@@ -108,7 +109,7 @@
NSData *input = [@"føöbärbãz" dataUsingEncoding:NSUTF8StringEncoding];
NSString *result = @"8A8B6142281950CBB9B01C9DF0DADB0BDAE2D0E1";
- STAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash of UTF-8 string");
+ XCTAssertEqualObjects([[input sha1Hash] dataToHexString], result, @"SHA1 hash of UTF-8 string");
}
}
@@ -122,11 +123,11 @@
NSData *encrypted = [raw dataEncryptedWithPassword:password];
//check that our encrypted data is not the plaintext data
NSData *encCore = [encrypted subdataWithRange:NSMakeRange(16, [raw length])];
- STAssertFalse([encCore isEqualToData:raw], @"encrypted equal to plain text!");
+ XCTAssertFalse([encCore isEqualToData:raw], @"encrypted equal to plain text!");
//decrypt again and verify
NSData *decrypted = [encrypted dataDecryptedWithPassword:password];
- STAssertEqualObjects(decrypted, raw, @"decrypted data not equal to plaintext data!");
+ XCTAssertEqualObjects(decrypted, raw, @"decrypted data not equal to plaintext data!");
}
- (void)testDataEncryptedWithKeyIV
@@ -143,7 +144,7 @@
{
@try {
[raw dataEncryptedWithKey:[@"password" dataUsingEncoding:NSASCIIStringEncoding] IV:iv];
- STFail(@"Password should not be a valid key!");
+ XCTFail(@"Password should not be a valid key!");
}
@catch (NSException *exception) {
//expected
@@ -153,7 +154,7 @@
{
@try {
[raw dataEncryptedWithKey:key IV:[NSData data]];
- STFail(@"Empty IV should throw exception!");
+ XCTFail(@"Empty IV should throw exception!");
}
@catch (NSException *exception) {
// expected
@@ -170,7 +171,7 @@
0x1d, 0x9f, 0x0c, 0x7a
}; // reference data generated with OpenSSL
NSData *expData = [NSData dataWithBytesNoCopy:expect length:sizeof(expect) freeWhenDone:NO];
- STAssertEqualObjects(enc, expData, @"Encryption of empty data");
+ XCTAssertEqualObjects(enc, expData, @"Encryption of empty data");
}
//simple encryption test
{
@@ -184,7 +185,7 @@
0x44, 0x32, 0xb3, 0xda, 0x42, 0x58, 0x29, 0x78, 0xc3
}; // reference data generated with OpenSSL
NSData *expData = [NSData dataWithBytesNoCopy:expect length:sizeof(expect) freeWhenDone:NO];
- STAssertEqualObjects(enc, expData, @"Simple encryption test");
+ XCTAssertEqualObjects(enc, expData, @"Simple encryption test");
}
}
@@ -204,7 +205,7 @@
NSData *decrypted = [encData dataDecryptedWithPassword:@""];
- STAssertEqualObjects(decrypted, raw, @"Decrypt simple data encrypted with empty password");
+ XCTAssertEqualObjects(decrypted, raw, @"Decrypt simple data encrypted with empty password");
}
- (void)testDataDecryptedWithKey
@@ -228,7 +229,7 @@
{
@try {
[encData dataDecryptedWithKey:[NSData data]];
- STFail(@"Invalid key length!");
+ XCTFail(@"Invalid key length!");
}
@catch (NSException *exception) {
//expected
@@ -238,7 +239,7 @@
{
@try {
[[@"Hello World!" dataUsingEncoding:NSASCIIStringEncoding] dataDecryptedWithKey:key];
- STFail(@"Invalid data length!");
+ XCTFail(@"Invalid data length!");
}
@catch (NSException *exception) {
//expected
@@ -247,17 +248,17 @@
// wrong data with valid length
{
NSData *inp = [@"12345678901234567890123456789012" dataUsingEncoding:NSASCIIStringEncoding];
- STAssertNil([inp dataDecryptedWithKey:key], @"Trying to decrypt invalid data.");
+ XCTAssertNil([inp dataDecryptedWithKey:key], @"Trying to decrypt invalid data.");
}
// wrong data with invalid length
{
NSData *inp = [@"12345678901234567890123456789012345678901234567" dataUsingEncoding:NSASCIIStringEncoding];
- STAssertNil([inp dataDecryptedWithKey:key], @"Trying to decrypt data with invalid length.");
+ XCTAssertNil([inp dataDecryptedWithKey:key], @"Trying to decrypt data with invalid length.");
}
// simple decryption test
{
NSData *decrypted = [encData dataDecryptedWithKey:key];
- STAssertEqualObjects(decrypted, raw, @"Simple Decryption test");
+ XCTAssertEqualObjects(decrypted, raw, @"Simple Decryption test");
}
// malicious message test
{
@@ -273,7 +274,7 @@
@try {
[_encData dataDecryptedWithKey:key];
- STFail(@"Malicious message with invalid data length");
+ XCTFail(@"Malicious message with invalid data length");
}
@catch (NSException *exception) {
//expected
@@ -281,4 +282,106 @@
}
}
+- (void)testEnumerateLinesBreakingAt_withBlock
+{
+ //simple empty data
+ {
+ __block NSUInteger invocations = 0;
+ NSData *data = [NSData data];
+ [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) {
+ invocations++;
+ }];
+ XCTAssertTrue(invocations==0, @"Empty data never invokes block");
+ }
+ //simple unix file
+ {
+ const char inp[] = "Two\nLines\n";
+ __block NSUInteger invocations = 0;
+ NSData *data = [NSData dataWithBytes:inp length:strlen(inp)];
+ [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) {
+ switch (invocations) {
+ case 0:
+ XCTAssertTrue(NSEqualRanges(line, NSMakeRange(0, 3)), @"range of first line");
+ break;
+ case 1:
+ XCTAssertTrue(NSEqualRanges(line, NSMakeRange(4, 5)), @"range of second line");
+ break;
+ }
+ invocations++;
+ }];
+ XCTAssertTrue(invocations==2, @"File with two lines, terminated with empty line");
+ }
+ //simple windows file without ending empty line
+ {
+ const char inp[] = "A\r\nWindows\r\nfile";
+ __block NSUInteger invocations = 0;
+ NSData *data = [NSData dataWithBytes:inp length:strlen(inp)];
+ [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) {
+ switch (invocations) {
+ case 0:
+ XCTAssertTrue(NSEqualRanges(line, NSMakeRange(0, 1)), @"range of first line");
+ break;
+ case 1:
+ XCTAssertTrue(NSEqualRanges(line, NSMakeRange(3, 7)), @"range of second line");
+ break;
+ case 2:
+ XCTAssertTrue(NSEqualRanges(line, NSMakeRange(12, 4)), @"range of third line");
+ break;
+ }
+ invocations++;
+ }];
+ XCTAssertTrue(invocations==3, @"File with three lines, CRLF, terminated with empty line");
+ }
+ //empty lines with all 3 endings
+ {
+ const char inp[] = "\n\r\n\r";
+ __block NSUInteger invocations = 0;
+ NSData *data = [NSData dataWithBytes:inp length:strlen(inp)];
+ [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) {
+ switch (invocations) {
+ case 0:
+ XCTAssertTrue(NSEqualRanges(line, NSMakeRange(0, 0)), @"range of first line");
+ break;
+ case 1:
+ XCTAssertTrue(NSEqualRanges(line, NSMakeRange(1, 0)), @"range of second line");
+ break;
+ case 2:
+ XCTAssertTrue(NSEqualRanges(line, NSMakeRange(3, 0)), @"range of third line");
+ break;
+ }
+ invocations++;
+ }];
+ XCTAssertTrue(invocations==3, @"LF, CRLF and CR mixed");
+ }
+ //looking for specific line breaks only
+ {
+ const char inp[] = "foo\nbar\r\nbaz\r";
+ __block NSUInteger invocations = 0;
+ NSData *data = [NSData dataWithBytes:inp length:strlen(inp)];
+ [data enumerateLinesBreakingAt:SPLineTerminatorCRLF withBlock:^(NSRange line, BOOL *stop) {
+ switch (invocations) {
+ case 0:
+ XCTAssertTrue(NSEqualRanges(line, NSMakeRange(0, 7)), @"range of first line");
+ break;
+ case 1:
+ XCTAssertTrue(NSEqualRanges(line, NSMakeRange(9, 4)), @"range of second line");
+ break;
+ }
+ invocations++;
+ }];
+ XCTAssertTrue(invocations==2, @"other line breaks when only CRLF is expected");
+ }
+ //stopping early
+ {
+ const char inp[] = "Two\nLines\n";
+ __block NSUInteger invocations = 0;
+ NSData *data = [NSData dataWithBytes:inp length:strlen(inp)];
+ [data enumerateLinesBreakingAt:SPLineTerminatorAny withBlock:^(NSRange line, BOOL *stop) {
+ invocations++;
+ *stop = YES;
+ }];
+ XCTAssertTrue(invocations==1, @"File with two lines, stopped after first");
+ }
+}
+
@end
diff --git a/UnitTests/SPDatabaseActionTest.m b/UnitTests/SPDatabaseActionTest.m
index f7704df5..a74dc0f0 100644
--- a/UnitTests/SPDatabaseActionTest.m
+++ b/UnitTests/SPDatabaseActionTest.m
@@ -29,14 +29,14 @@
// More info at <https://github.com/sequelpro/sequelpro>
#import <OCMock/OCMock.h>
-#import <SenTestingKit/SenTestingKit.h>
+#import <XCTest/XCTest.h>
#import "SPDatabaseAction.h"
#import <SPMySQL/SPMySQL.h>
-@interface SPDatabaseActionTest : SenTestCase
+@interface SPDatabaseActionTest : XCTestCase
- (void)testCreateDatabase_01_emptyName;
- (void)testCreateDatabase_02_allParams;
@@ -53,7 +53,7 @@
SPDatabaseAction *createDb = [[[SPDatabaseAction alloc] init] autorelease];
[createDb setConnection:mockConnection];
- STAssertFalse([createDb createDatabase:@"" withEncoding:nil collation:nil],@"create database = NO with empty db name");
+ XCTAssertFalse([createDb createDatabase:@"" withEncoding:nil collation:nil],@"create database = NO with empty db name");
OCMVerifyAll(mockConnection);
}
@@ -69,7 +69,7 @@
SPDatabaseAction *createDb = [[[SPDatabaseAction alloc] init] autorelease];
[createDb setConnection:mockConnection];
- STAssertTrue([createDb createDatabase:@"target_name" withEncoding:@"utf8" collation:@"utf8_bin_ci"], @"create database return");
+ XCTAssertTrue([createDb createDatabase:@"target_name" withEncoding:@"utf8" collation:@"utf8_bin_ci"], @"create database return");
OCMVerifyAll(mockConnection);
}
@@ -84,7 +84,7 @@
SPDatabaseAction *createDb = [[[SPDatabaseAction alloc] init] autorelease];
[createDb setConnection:mockConnection];
- STAssertTrue([createDb createDatabase:@"target_name" withEncoding:@"" collation:nil], @"create database return");
+ XCTAssertTrue([createDb createDatabase:@"target_name" withEncoding:@"" collation:nil], @"create database return");
OCMVerifyAll(mockConnection);
}
diff --git a/UnitTests/SPMenuAdditionsTests.m b/UnitTests/SPMenuAdditionsTests.m
index 83647e6f..7e8b5ecc 100644
--- a/UnitTests/SPMenuAdditionsTests.m
+++ b/UnitTests/SPMenuAdditionsTests.m
@@ -30,7 +30,7 @@
#import "SPMenuAdditions.h"
-#import <SenTestingKit/SenTestingKit.h>
+#import <XCTest/XCTest.h>
/**
* @class SPMenuAdditionsTests SPMenuAdditionsTests.h
@@ -39,7 +39,7 @@
*
* SPMenuAdditionsTests tests class.
*/
-@interface SPMenuAdditionsTests : SenTestCase
+@interface SPMenuAdditionsTests : XCTestCase
{
NSMenu *menu;
}
@@ -71,7 +71,7 @@ static NSString *SPTestMenuItemTitle = @"Menu Item";
{
[menu compatibleRemoveAllItems];
- STAssertFalse([menu numberOfItems], @"The menu should have no menu items.");
+ XCTAssertFalse([menu numberOfItems], @"The menu should have no menu items.");
}
@end
diff --git a/UnitTests/SPMutableArrayAdditionsTests.m b/UnitTests/SPMutableArrayAdditionsTests.m
index e09f00a4..82fec400 100644
--- a/UnitTests/SPMutableArrayAdditionsTests.m
+++ b/UnitTests/SPMutableArrayAdditionsTests.m
@@ -30,7 +30,7 @@
#import "SPMutableArrayAdditions.h"
-#import <SenTestingKit/SenTestingKit.h>
+#import <XCTest/XCTest.h>
/**
* @class SPMutableArrayAdditionsTest SPMutableArrayAdditionsTest.h
@@ -39,7 +39,7 @@
*
* SPMutableArrayAdditions tests class.
*/
-@interface SPMutableArrayAdditionsTests : SenTestCase
+@interface SPMutableArrayAdditionsTests : XCTestCase
@end
@@ -55,7 +55,7 @@
[testArray reverse];
- STAssertEqualObjects(testArray, expectedArray, @"The reversed array should look like: %@, but actually looks like: %@", expectedArray, testArray);
+ XCTAssertEqualObjects(testArray, expectedArray, @"The reversed array should look like: %@, but actually looks like: %@", expectedArray, testArray);
}
@end
diff --git a/UnitTests/SPParserUtilsTest.m b/UnitTests/SPParserUtilsTest.m
index 994b166a..6796a250 100644
--- a/UnitTests/SPParserUtilsTest.m
+++ b/UnitTests/SPParserUtilsTest.m
@@ -31,11 +31,11 @@
#define USE_APPLICATION_UNIT_TEST 1
#import <Cocoa/Cocoa.h>
-#import <SenTestingKit/SenTestingKit.h>
+#import <XCTest/XCTest.h>
#include "SPParserUtils.h"
-@interface SPParserUtilsTest : SenTestCase
+@interface SPParserUtilsTest : XCTestCase
- (void)testUtf8strlen;
@@ -49,39 +49,39 @@
const char *empty = "";
NSString *emptyString = [NSString stringWithCString:empty encoding:NSUTF8StringEncoding];
- STAssertEquals(utf8strlen(empty),[emptyString length], @"empty string");
+ XCTAssertEqual(utf8strlen(empty),[emptyString length], @"empty string");
// This is just a little safeguard.
// If any of those conditions fail, all of the following assumptions are moot.
const char *charSeq = "\xF0\x9F\x8D\x8F"; //🍏
NSString *charString = [NSString stringWithCString:charSeq encoding:NSUTF8StringEncoding];
- STAssertEquals(strlen(charSeq), (size_t)4, @"assumption about storage for binary C string");
- STAssertEquals([charString length], (NSUInteger)2, @"assumption about NSString internal storage of string");
+ XCTAssertEqual(strlen(charSeq), (size_t)4, @"assumption about storage for binary C string");
+ XCTAssertEqual([charString length], (NSUInteger)2, @"assumption about NSString internal storage of string");
const char *singleByteSeq = "Hello World!";
NSString *singleByteString = [NSString stringWithCString:singleByteSeq encoding:NSUTF8StringEncoding];
- STAssertEquals(utf8strlen(singleByteSeq), [singleByteString length], @"ASCII UTF-8 subset");
+ XCTAssertEqual(utf8strlen(singleByteSeq), [singleByteString length], @"ASCII UTF-8 subset");
const char *twoByteSeq = "H\xC3\xA4ll\xC3\xB6 W\xC3\x9Crld\xC3\x9F!"; // Hällö WÜrldß!
NSString *twoByteString = [NSString stringWithCString:twoByteSeq encoding:NSUTF8StringEncoding];
- STAssertEquals(utf8strlen(twoByteSeq), [twoByteString length], @"String containing two-byte utf8 characters");
+ XCTAssertEqual(utf8strlen(twoByteSeq), [twoByteString length], @"String containing two-byte utf8 characters");
const char *threeByteSeq = "\xE3\x81\x93.\xE3\x82\x93.\xE3\x81\xAB.\xE3\x81\xA1.\xE3\x81\xAF"; // こ.ん.に.ち.は
NSString *threeByteString = [NSString stringWithCString:threeByteSeq encoding:NSUTF8StringEncoding];
- STAssertEquals(utf8strlen(threeByteSeq), [threeByteString length], @"String containing three-byte utf8 characters");
+ XCTAssertEqual(utf8strlen(threeByteSeq), [threeByteString length], @"String containing three-byte utf8 characters");
const char *fourByteSeq = "\xF0\x9F\x8D\x8F\xF0\x9F\x8D\x8B\xF0\x9F\x8D\x92"; //🍏🍋🍒
NSString *fourByteString = [NSString stringWithCString:fourByteSeq encoding:NSUTF8StringEncoding];
- STAssertEquals(utf8strlen(fourByteSeq), [fourByteString length], @"String containing only 4-byte utf8 characters (outside BMP)");
+ XCTAssertEqual(utf8strlen(fourByteSeq), [fourByteString length], @"String containing only 4-byte utf8 characters (outside BMP)");
const char *mixedSeq = "\xE3\x81\x82\xE3\x82\x81\xE3\x80\x90\xE9\xA3\xB4\xE3\x80\x91\xF0\x9F\x8D\xAD \xE2\x89\x88 S\xC3\xBC\xC3\x9Figkeit"; // あめ【飴】🍭 ≈ Süßigkeit
NSString *mixedString = [NSString stringWithCString:mixedSeq encoding:NSUTF8StringEncoding];
- STAssertEquals(utf8strlen(mixedSeq), [mixedString length], @"utf8 characters with all 4 lengths mixed together.");
+ XCTAssertEqual(utf8strlen(mixedSeq), [mixedString length], @"utf8 characters with all 4 lengths mixed together.");
//composed vs. decomposed chars
const char *decompSeq = "\xC3\xA4 - a\xCC\x88"; // ä - ä
NSString *decompString = [NSString stringWithCString:decompSeq encoding:NSUTF8StringEncoding];
- STAssertEquals(utf8strlen(decompSeq), [decompString length], @"\"LATIN SMALL LETTER A WITH DIAERESIS\" vs. \"LATIN SMALL LETTER A\" + \"COMBINING DIAERESIS\"");
+ XCTAssertEqual(utf8strlen(decompSeq), [decompString length], @"\"LATIN SMALL LETTER A WITH DIAERESIS\" vs. \"LATIN SMALL LETTER A\" + \"COMBINING DIAERESIS\"");
}
@end
diff --git a/UnitTests/SPStringAdditionsTests.m b/UnitTests/SPStringAdditionsTests.m
index 23ec82e9..eca9f7ab 100644
--- a/UnitTests/SPStringAdditionsTests.m
+++ b/UnitTests/SPStringAdditionsTests.m
@@ -31,14 +31,15 @@
#import "SPStringAdditions.h"
#import "RegexKitLite.h"
-#import <SenTestingKit/SenTestingKit.h>
+#import <XCTest/XCTest.h>
-@interface SPStringAdditionsTests : SenTestCase
+@interface SPStringAdditionsTests : XCTestCase
- (void)testStringByRemovingCharactersInSet;
- (void)testStringWithNewUUID;
- (void)testCreateViewSyntaxPrettifier;
- (void)testNonConsecutivelySearchStringMatchingRanges;
+- (void)testStringByReplacingCharactersInSetWithString;
@end
@@ -64,12 +65,12 @@ static NSRange RangeFromArray(NSArray *a,NSUInteger idx);
NSString *expectedUTFString = @"In der Krze liegt die Wrz";
NSString *expectedASCIIString = @"this is ig rzy test string with some rndom spes nd quotes";
- STAssertEqualObjects([actualASCIIString stringByRemovingCharactersInSet:junk],
+ XCTAssertEqualObjects([actualASCIIString stringByRemovingCharactersInSet:junk],
expectedASCIIString,
@"The following characters should have been removed %@",
charsToRemove);
- STAssertEqualObjects([actualUTFString stringByRemovingCharactersInSet:junk],
+ XCTAssertEqualObjects([actualUTFString stringByRemovingCharactersInSet:junk],
expectedUTFString,
@"The following characters should have been removed %@",
charsToRemove);
@@ -82,7 +83,7 @@ static NSRange RangeFromArray(NSArray *a,NSUInteger idx);
{
NSString *uuid = [NSString stringWithNewUUID];
- STAssertTrue([uuid isMatchedByRegex:@"[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}"], @"UUID %@ doesn't match regex", uuid);
+ XCTAssertTrue([uuid isMatchedByRegex:@"[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}"], @"UUID %@ doesn't match regex", uuid);
}
/**
@@ -95,7 +96,7 @@ static NSRange RangeFromArray(NSArray *a,NSUInteger idx);
NSString *actualSyntax = [originalSyntax createViewSyntaxPrettifier];
- STAssertEqualObjects([actualSyntax description], [expectedSyntax description], @"Actual view syntax '%@' does not equal expected syntax '%@'", actualSyntax, expectedSyntax);
+ XCTAssertEqualObjects([actualSyntax description], [expectedSyntax description], @"Actual view syntax '%@' does not equal expected syntax '%@'", actualSyntax, expectedSyntax);
}
- (void)testNonConsecutivelySearchStringMatchingRanges
@@ -103,48 +104,48 @@ static NSRange RangeFromArray(NSArray *a,NSUInteger idx);
//basic tests
{
NSArray *matches = nil;
- STAssertTrue([@"" nonConsecutivelySearchString:@"" matchingRanges:&matches], @"Equality of empty strings");
- STAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(0, 0), RangeFromArray(matches, 0)), @"Returned matches in empty string");
+ XCTAssertTrue([@"" nonConsecutivelySearchString:@"" matchingRanges:&matches], @"Equality of empty strings");
+ XCTAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(0, 0), RangeFromArray(matches, 0)), @"Returned matches in empty string");
}
{
NSArray *matches = (void *)0xdeadbeef;
- STAssertFalse([@"" nonConsecutivelySearchString:@"R" matchingRanges:&matches], @"Inequality with empty left side");
- STAssertTrue((matches == (void *)0xdeadbeef), @"out variable not touched by mismatch");
+ XCTAssertFalse([@"" nonConsecutivelySearchString:@"R" matchingRanges:&matches], @"Inequality with empty left side");
+ XCTAssertTrue((matches == (void *)0xdeadbeef), @"out variable not touched by mismatch");
}
- STAssertFalse([@"L" nonConsecutivelySearchString:@"" matchingRanges:NULL], @"Inequality with empty right side");
+ XCTAssertFalse([@"L" nonConsecutivelySearchString:@"" matchingRanges:NULL], @"Inequality with empty right side");
{
NSArray *matches = nil;
- STAssertTrue([@"left" nonConsecutivelySearchString:@"le" matchingRanges:&matches], @"Anchored match left");
- STAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(0, 2), RangeFromArray(matches, 0)), @"Returned matches in anchored left match");
+ XCTAssertTrue([@"left" nonConsecutivelySearchString:@"le" matchingRanges:&matches], @"Anchored match left");
+ XCTAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(0, 2), RangeFromArray(matches, 0)), @"Returned matches in anchored left match");
}
{
NSArray *matches = nil;
- STAssertTrue([@"right" nonConsecutivelySearchString:@"ht" matchingRanges:&matches], @"Anchored match right");
- STAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(3, 2), RangeFromArray(matches, 0)), @"Returned matches in anchroed right match");
+ XCTAssertTrue([@"right" nonConsecutivelySearchString:@"ht" matchingRanges:&matches], @"Anchored match right");
+ XCTAssertTrue(([matches count] == 1) && NSEqualRanges(NSMakeRange(3, 2), RangeFromArray(matches, 0)), @"Returned matches in anchroed right match");
}
- STAssertFalse([@"ht" nonConsecutivelySearchString:@"right" matchingRanges:NULL], @"Left and Right are not commutative");
+ XCTAssertFalse([@"ht" nonConsecutivelySearchString:@"right" matchingRanges:NULL], @"Left and Right are not commutative");
//real tests
{
NSArray *matches = nil;
- STAssertTrue([@"... is not secure anymore!" nonConsecutivelySearchString:@"NSA" matchingRanges:&matches], @"Non-consecutive match, ignoring case");
- STAssertTrue(([matches count] == 3) &&
+ XCTAssertTrue([@"... is not secure anymore!" nonConsecutivelySearchString:@"NSA" matchingRanges:&matches], @"Non-consecutive match, ignoring case");
+ XCTAssertTrue(([matches count] == 3) &&
NSEqualRanges(NSMakeRange( 7, 1), RangeFromArray(matches, 0)) &&
NSEqualRanges(NSMakeRange(11, 1), RangeFromArray(matches, 1)) &&
NSEqualRanges(NSMakeRange(18, 1), RangeFromArray(matches, 2)), @"Returned matches in non-consecutive string");
}
- STAssertFalse([@"Deoxyribonucleic Acid" nonConsecutivelySearchString:@"DNS" matchingRanges:NULL], @"Non-consecutive mismatch");
+ XCTAssertFalse([@"Deoxyribonucleic Acid" nonConsecutivelySearchString:@"DNS" matchingRanges:NULL], @"Non-consecutive mismatch");
{
NSArray *matches = nil;
- STAssertTrue([@"Turn left, then right at the corner" nonConsecutivelySearchString:@"left right" matchingRanges:&matches], @"Partly consecutive match");
- STAssertTrue(([matches count] == 2) &&
+ XCTAssertTrue([@"Turn left, then right at the corner" nonConsecutivelySearchString:@"left right" matchingRanges:&matches], @"Partly consecutive match");
+ XCTAssertTrue(([matches count] == 2) &&
(NSEqualRanges(NSMakeRange( 5, 4), RangeFromArray(matches, 0))) &&
(NSEqualRanges(NSMakeRange(15, 6), RangeFromArray(matches, 1))), @"Returned matches in partly-consecutive string");
}
@@ -158,8 +159,8 @@ static NSRange RangeFromArray(NSArray *a,NSUInteger idx);
// ^^^^^^^ ^ ^ ^ ^ = 5 (after optimizing consecutive atomic matches)
// Desired: "central_private_rabbit_park"
// ^^^^^^^ ^^^^ = 2
- STAssertTrue([@"central_private_rabbit_park" nonConsecutivelySearchString:@"centralpark" matchingRanges:&matches], @"Optimization partly consecutive match");
- STAssertTrue((([matches count] == 2) &&
+ XCTAssertTrue([@"central_private_rabbit_park" nonConsecutivelySearchString:@"centralpark" matchingRanges:&matches], @"Optimization partly consecutive match");
+ XCTAssertTrue((([matches count] == 2) &&
(NSEqualRanges(NSMakeRange( 0, 7), RangeFromArray(matches, 0))) &&
(NSEqualRanges(NSMakeRange(23, 4), RangeFromArray(matches, 1)))), @"Returned matches set is minimal");
}
@@ -171,8 +172,8 @@ static NSRange RangeFromArray(NSArray *a,NSUInteger idx);
// Unoptimized: ^ ^ ^ ^ ^ ^ ^ = 7
// Desired: ^ ^^^ ^^^ = 3
NSArray *matches = nil;
- STAssertTrue([@"a.?a?ab?abc?1?12?123?" nonConsecutivelySearchString:@".abc123" matchingRanges:&matches], @"Optimization non-consecutive match");
- STAssertTrue((([matches count] == 3) &&
+ XCTAssertTrue([@"a.?a?ab?abc?1?12?123?" nonConsecutivelySearchString:@".abc123" matchingRanges:&matches], @"Optimization non-consecutive match");
+ XCTAssertTrue((([matches count] == 3) &&
(NSEqualRanges(NSMakeRange( 1, 1), RangeFromArray(matches, 0))) &&
(NSEqualRanges(NSMakeRange( 8, 3), RangeFromArray(matches, 1))) &&
(NSEqualRanges(NSMakeRange(17, 3), RangeFromArray(matches, 2)))), @"Returned matches set is minimal (2)");
@@ -183,18 +184,38 @@ static NSRange RangeFromArray(NSArray *a,NSUInteger idx);
// LATIN CAPITAL LETTER A == LATIN SMALL LETTER A
// LATIN SMALL LETTER O WITH DIAERESIS == LATIN SMALL LETTER O
// FULLWIDTH LATIN SMALL LETTER b == LATIN SMALL LETTER B
- STAssertTrue([@"A:\xC3\xB6:\xEF\xBD\x82" nonConsecutivelySearchString:@"aob" matchingRanges:NULL], @"Fuzzy matching of defined characters");
+ XCTAssertTrue([@"A:\xC3\xB6:\xEF\xBD\x82" nonConsecutivelySearchString:@"aob" matchingRanges:NULL], @"Fuzzy matching of defined characters");
//all bytes on the right are contained on the left, but on a character level "ä" is not contained in "Hütte Ф"
- STAssertFalse([@"H\xC3\xBCtte \xD0\xA4" nonConsecutivelySearchString:@"\xC3\xA4" matchingRanges:NULL], @"Mismatch of composed characters with same prefix");
+ XCTAssertFalse([@"H\xC3\xBCtte \xD0\xA4" nonConsecutivelySearchString:@"\xC3\xA4" matchingRanges:NULL], @"Mismatch of composed characters with same prefix");
// ":😥:𠘄:" vs "😄" (according to wikipedia "𠘄" is the arachic variant of "印")
// TECHNICALLY THIS SHOULD NOT MATCH!
// However Apple doesn't correctly handle characters in the 4-Byte UTF range, so let's use this test to check for changes in Apples behaviour :)
- STAssertTrue([@":\xF0\x9F\x98\x84:\xF0\xA0\x98\x84:" nonConsecutivelySearchString:@"\xF0\x9F\x98\x84" matchingRanges:NULL], @"Mismatch of composed characters (4-byte) with same prefix");
+ XCTAssertTrue([@":\xF0\x9F\x98\x84:\xF0\xA0\x98\x84:" nonConsecutivelySearchString:@"\xF0\x9F\x98\x84" matchingRanges:NULL], @"Mismatch of composed characters (4-byte) with same prefix");
}
+- (void)testStringByReplacingCharactersInSetWithString
+{
+ {
+ //test against empty string
+ XCTAssertEqualObjects([@"" stringByReplacingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] withString:@"x"], @"", @"replacement on empty string must result in empty string");
+ }
+ {
+ //test match at begin, middle, end / consecutive matches
+ XCTAssertEqualObjects([@" ab c " stringByReplacingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] withString:@"_"], @"_ab__c_", @"Testing matches at both end, replacement of consecutive matches");
+ }
+ {
+ //test replacement of different characters
+ XCTAssertEqualObjects([@"ab\r\ncd" stringByReplacingCharactersInSet:[NSCharacterSet newlineCharacterSet] withString:@"*"], @"ab**cd", @"Testing replacement of different characters in set");
+ }
+ {
+ // nil for replacement char
+ XCTAssertEqualObjects([@"ab\r\ncd" stringByReplacingCharactersInSet:[NSCharacterSet newlineCharacterSet] withString:nil], @"abcd", @"testing replacement with nil");
+ }
+}
+
@end
NSRange RangeFromArray(NSArray *a,NSUInteger idx)
diff --git a/UnitTests/SPTableCopyTest.m b/UnitTests/SPTableCopyTest.m
index 76a2fe45..563322df 100644
--- a/UnitTests/SPTableCopyTest.m
+++ b/UnitTests/SPTableCopyTest.m
@@ -31,60 +31,71 @@
#import "SPTableCopy.h"
#import <SPMySQL/SPMySQL.h>
-#import <SenTestingKit/SenTestingKit.h>
+#import <XCTest/XCTest.h>
#import <OCMock/OCMock.h>
#define USE_APPLICATION_UNIT_TEST 1
-@interface SPTableCopyTest : SenTestCase
+@interface SPTableCopyTest : XCTestCase
- (void)testCopyTableFromToWithData;
+- (void)testCopyTableFromTo_NoPermissions;
@end
@implementation SPTableCopyTest
-- (id)mockConnection
-{
- return [[OCMockObject niceMockForClass:[SPMySQLConnection class]] autorelease];
-}
-
-- (id)mockResult
-{
- return [[OCMockObject niceMockForClass:[SPMySQLResult class]] autorelease];
-}
-
- (void)testCopyTableFromToWithData
{
- id mockResult = [self mockResult];
+ id mockResult = OCMClassMock([SPMySQLResult class]);
- unsigned long long varOne = 1;
- NSValue *valueOne = [NSValue value:&varOne withObjCType:@encode(__typeof__(varOne))];
- BOOL varNo = NO;
-
- NSValue *valueNo = [NSValue value:&varNo withObjCType:@encode(BOOL)];
NSArray *resultArray = [[NSArray alloc] initWithObjects:@"", @"CREATE TABLE `table_name` ()", nil];
- id mockConnection = [self mockConnection];
+ id mockConnection = OCMClassMock([SPMySQLConnection class]);
- [(SPMySQLResult *)[[mockResult expect] andReturn:valueOne] numberOfRows];
- [[[mockResult expect] andReturn:resultArray] getRowAsArray];
+ OCMExpect([mockResult numberOfRows]).andReturn(1);
+ OCMExpect([mockResult getRowAsArray]).andReturn(resultArray);
- [[[mockConnection expect] andReturn:mockResult] queryString:@"SHOW CREATE TABLE `source_db`.`table_name`"];
- [[mockConnection expect] queryString:@"CREATE TABLE `target_db`.`table_name` ()"];
- [[mockConnection expect] queryString:@"INSERT INTO `target_db`.`table_name` SELECT * FROM `source_db`.`table_name`"];
- [[[mockConnection stub] andReturnValue:valueNo] queryErrored];
+ OCMExpect([mockConnection queryString:@"SHOW CREATE TABLE `source_db`.`table_name`"]).andReturn(mockResult);
+ OCMExpect([mockConnection queryString:@"CREATE TABLE `target_db`.`table_name` ()"]);
+ OCMExpect([mockConnection queryString:@"INSERT INTO `target_db`.`table_name` SELECT * FROM `source_db`.`table_name`"]);
+ OCMStub([mockConnection queryErrored]).andReturn(NO);
- SPTableCopy *tableCopy = [[SPTableCopy alloc] init];
-
- [tableCopy setConnection:mockConnection];
- [tableCopy copyTable:@"table_name" from:@"source_db" to:@"target_db" withContent:YES];
+ {
+ SPTableCopy *tableCopy = [[SPTableCopy alloc] init];
+
+ [tableCopy setConnection:mockConnection];
+ [tableCopy copyTable:@"table_name" from:@"source_db" to:@"target_db" withContent:YES];
+
+ [tableCopy release];
+ }
- [mockResult verify];
- [mockConnection verify];
+ OCMVerifyAll(mockResult);
+ OCMVerifyAll(mockConnection);
- [tableCopy release];
[resultArray release];
}
+- (void)testCopyTableFromTo_NoPermissions
+{
+ id mockConnection = OCMStrictClassMock([SPMySQLConnection class]);
+
+ OCMExpect([mockConnection queryString:@"SHOW CREATE TABLE `source_db`.`table_name`"]).andReturn(nil);
+ OCMStub([mockConnection queryErrored]).andReturn(YES);
+ OCMStub([mockConnection lastErrorMessage]).andReturn(@"SHOW command denied to user 'alice'@'localhost' for table 'table_name'");
+ OCMStub([mockConnection lastErrorID]).andReturn(1142);
+ OCMStub([mockConnection lastSqlstate]).andReturn(@"42000");
+
+ {
+ SPTableCopy *tableCopy = [[SPTableCopy alloc] init];
+ [tableCopy setConnection:mockConnection];
+
+ XCTAssertFalse([tableCopy copyTable:@"table_name" from:@"source_db" to:@"target_db"], @"copy operation must fail.");
+
+ [tableCopy release];
+ }
+
+ [mockConnection verify];
+}
+
@end
diff --git a/UnitTests/SPTableFilterParserTest.m b/UnitTests/SPTableFilterParserTest.m
index d5f46969..1ff69e7f 100644
--- a/UnitTests/SPTableFilterParserTest.m
+++ b/UnitTests/SPTableFilterParserTest.m
@@ -12,9 +12,9 @@
#define USE_APPLICATION_UNIT_TEST 1
#import <Cocoa/Cocoa.h>
-#import <SenTestingKit/SenTestingKit.h>
+#import <XCTest/XCTest.h>
-@interface SPTableFilterParserTest : SenTestCase
+@interface SPTableFilterParserTest : XCTestCase
- (void)testFilterString;
@@ -29,7 +29,7 @@
[p setCurrentField:@"FLD"];
// binary matches as "$BINARY ", eating the one additional whitespace
- STAssertEqualObjects([p filterString],@"`FLD` constant string", @"Constant replacement");
+ XCTAssertEqualObjects([p filterString],@"`FLD` constant string", @"Constant replacement");
}
//simple one argument case with binary
{
@@ -38,7 +38,7 @@
[p setCaseSensitive:YES];
[p setArgument:@"arg1"];
- STAssertEqualObjects([p filterString], @"`FLD2` = FOO(BINARY arg1)", @"One Argument, $BINARY variable");
+ XCTAssertEqualObjects([p filterString], @"`FLD2` = FOO(BINARY arg1)", @"One Argument, $BINARY variable");
}
//simple two argument case with explicit current field
{
@@ -48,7 +48,7 @@
[p setFirstBetweenArgument:@"LA"];
[p setSecondBetweenArgument:@"RA"];
- STAssertEqualObjects([p filterString], @"MIN(`FLD3`,LA) = RA", @"Two Arguments, $CURRENT_FIELD variable");
+ XCTAssertEqualObjects([p filterString], @"MIN(`FLD3`,LA) = RA", @"Two Arguments, $CURRENT_FIELD variable");
}
}