aboutsummaryrefslogtreecommitdiffstats
path: root/Frameworks/SPMySQLFramework/SPMySQL Unit Tests
diff options
context:
space:
mode:
Diffstat (limited to 'Frameworks/SPMySQLFramework/SPMySQL Unit Tests')
-rw-r--r--Frameworks/SPMySQLFramework/SPMySQL Unit Tests/DataConversion_Tests.m77
-rw-r--r--Frameworks/SPMySQLFramework/SPMySQL Unit Tests/Info.plist24
-rw-r--r--Frameworks/SPMySQLFramework/SPMySQL Unit Tests/SPMySQLStringAdditions_Tests.m89
3 files changed, 190 insertions, 0 deletions
diff --git a/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/DataConversion_Tests.m b/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/DataConversion_Tests.m
new file mode 100644
index 00000000..b8256a5c
--- /dev/null
+++ b/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/DataConversion_Tests.m
@@ -0,0 +1,77 @@
+//
+// DataConversion_Tests.m
+// SPMySQLFramework
+//
+// Created by Max Lohrmann on 01.10.15.
+// Copyright (c) 2015 Max Lohrmann. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// 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
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS 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.
+//
+// More info at <https://github.com/sequelpro/sequelpro>
+
+#import <Cocoa/Cocoa.h>
+#import <XCTest/XCTest.h>
+
+// this function is inaccessible outside of unit tests
+extern NSString * _bitStringWithBytes(const char *bytes, NSUInteger length, NSUInteger padLength);
+
+@interface DataConversion_Tests : XCTestCase
+
+- (void)test_bitStringWithBytes;
+
+@end
+
+@implementation DataConversion_Tests
+
+- (void)test_bitStringWithBytes
+{
+ // BIT(1)
+ {
+ const char y = '\1';
+ const char n = '\0';
+ XCTAssertEqualObjects(_bitStringWithBytes(&y,sizeof(y),1), @"1");
+ XCTAssertEqualObjects(_bitStringWithBytes(&n,sizeof(n),1), @"0");
+ }
+ // BIT(3)
+ {
+ const char input[] = {5};
+ NSUInteger bitSize = 3;
+ NSString *res = _bitStringWithBytes(input,sizeof(input),bitSize);
+ XCTAssertEqualObjects(res, @"101");
+ }
+ // BIT(16)
+ {
+ const char input[] = {0xcc,0xf0};
+ NSUInteger bitSize = 16;
+ NSString *res = _bitStringWithBytes(input,sizeof(input),bitSize);
+ XCTAssertEqualObjects(res, @"1100110011110000");
+ }
+ // BIT(20)
+ {
+ const char input[] = {0x0f,0xcc,0xf0};
+ NSUInteger bitSize = 20;
+ NSString *res = _bitStringWithBytes(input,sizeof(input),bitSize);
+ XCTAssertEqualObjects(res, @"11111100110011110000");
+ }
+}
+
+@end
diff --git a/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/Info.plist b/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/Info.plist
new file mode 100644
index 00000000..ba72822e
--- /dev/null
+++ b/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/Info.plist
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>$(PRODUCT_NAME)</string>
+ <key>CFBundlePackageType</key>
+ <string>BNDL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+</dict>
+</plist>
diff --git a/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/SPMySQLStringAdditions_Tests.m b/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/SPMySQLStringAdditions_Tests.m
new file mode 100644
index 00000000..cc1f44dd
--- /dev/null
+++ b/Frameworks/SPMySQLFramework/SPMySQL Unit Tests/SPMySQLStringAdditions_Tests.m
@@ -0,0 +1,89 @@
+//
+// SPMySQLStringAdditions_Tests.m
+// SPMySQLFramework
+//
+// Created by Max Lohrmann on 04.10.15.
+//
+//
+
+#import <Cocoa/Cocoa.h>
+#import <XCTest/XCTest.h>
+#import <SPMySQL/SPMySQL.h>
+
+@interface SPMySQLStringAdditions_Tests : XCTestCase
+
+- (void)test_mySQLBacktickQuotedString;
+- (void)test_mySQLTickQuotedString;
+- (void)test_stringForDataBytesLengthEncoding;
+
+@end
+
+@implementation SPMySQLStringAdditions_Tests
+
+- (void)test_mySQLBacktickQuotedString
+{
+ XCTAssertEqualObjects([@"" mySQLBacktickQuotedString], @"``",@"empty string");
+
+ XCTAssertEqualObjects([@"tbl1" mySQLBacktickQuotedString], @"`tbl1`", @"regular string");
+
+ XCTAssertEqualObjects([@"tbl`1" mySQLBacktickQuotedString], @"`tbl``1`",@"string with control character");
+
+ XCTAssertEqualObjects([@"tbl``" mySQLBacktickQuotedString], @"`tbl`````",@"string with escaped control character at end");
+}
+
+- (void)test_mySQLTickQuotedString
+{
+ XCTAssertEqualObjects([@"" mySQLTickQuotedString], @"''",@"empty string");
+
+ XCTAssertEqualObjects([@"tbl1" mySQLTickQuotedString], @"'tbl1'", @"regular string");
+
+ XCTAssertEqualObjects([@"tbl'1" mySQLTickQuotedString], @"'tbl''1'",@"string with control character");
+
+ XCTAssertEqualObjects([@"tbl''" mySQLTickQuotedString], @"'tbl'''''",@"string with escaped control character at end");
+}
+
+- (void)test_stringForDataBytesLengthEncoding
+{
+ {
+ const char chr = '\0';
+ NSString *conv = [NSString stringForDataBytes:&chr length:0 encoding:NSISOLatin1StringEncoding];
+ XCTAssertEqualObjects(conv, @"",@"empty string test");
+ }
+ {
+ const char *cstr = "an ASCII C string";
+ NSString *conv = [NSString stringForDataBytes:cstr length:strlen(cstr) encoding:NSASCIIStringEncoding];
+ XCTAssertEqualObjects(conv, @"an ASCII C string", @"simple ASCII string test");
+ }
+ {
+ // the euro sign is the tricky part
+ // ISO-8859-1 (aka Latin1): not supported, codepoint 0x80 is not in use
+ // ISO-8859-1 + ISO/IEC 6429: not supported, codepoint 0x80 is PAD control character
+ // ISO-8859-15 (aka Latin9): € is at 0xA4, codepoint 0x80 is PAD control character
+ // Windows cp1252 (aka latin1 in mysql): € is at 0x80, codepoint 0xA4 is "¤"
+ const char cstr[] = {'\xE4','-','\xDF','-','\x80','\0'};
+ NSString *conv = [NSString stringForDataBytes:cstr length:strlen(cstr) encoding:NSWindowsCP1252StringEncoding];
+ XCTAssertEqualObjects(conv, @"ä-ß-€",@"handling of cp1252 special characters");
+
+ unsigned char latin9 = 0xA4;
+ NSString *conv2 = [NSString stringForDataBytes:&latin9 length:1 encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatin9)];
+ XCTAssertEqualObjects(conv2, @"€",@"handling of iso-8859-15 special characters");
+ }
+ {
+ const char *cstr = "エスキューエル";
+ NSString *conv = [NSString stringForDataBytes:cstr length:strlen(cstr) encoding:NSUTF8StringEncoding];
+ XCTAssertEqualObjects(conv, @"エスキューエル",@"handling of valid utf-8 string");
+ }
+ {
+ // this is a test for a certain mysql issue:
+ // mysql limits field names to 255 characters and will even cut multibyte chars in the middle,
+ // if neccesary. This will create invalid characters which cause NSString
+ // to fail and return nil on the whole string. Since we know that, we can
+ // at least try to return something.
+ char cstr[] = {'\xE3','\x82','\xA8','\xE3','\x82','\xB9','\xE3','\x82','\xAD','\xE3','\x83','\xA5','\xE3','\x83','\xBC','\xE3','\x82','\xA8','\xE3','\x83','\xAB','\0'}; // エスキューエル
+ cstr[strlen(cstr)-2] = '\0'; //simulate cutting off the string
+ NSString *conv = [NSString stringForDataBytes:cstr length:strlen(cstr) encoding:NSUTF8StringEncoding];
+ XCTAssertNotNil(conv, @"handling of invalid utf8 sequences");
+ }
+}
+
+@end