/* * Copyright (c) 2008, 2009, 2010, 2011, 2012 * Jonathan Schleifer <js@webkeks.org> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #include <string.h> #import "OFDataArray.h" #import "OFString.h" #import "OFAutoreleasePool.h" #import "OFOutOfRangeException.h" #import "TestsAppDelegate.h" static OFString *module; const char *str = "Hello!"; @implementation TestsAppDelegate (OFDataArrayTests) - (void)dataArrayTestsWithClass: (Class)class { OFDataArray *array[4]; void *data[2]; Class other; TEST(@"+[dataArrayWithItemSize:]", (array[0] = [class dataArrayWithItemSize: 4096])) data[0] = [array[0] allocMemoryWithSize: 4096]; data[1] = [array[0] allocMemoryWithSize: 4096]; memset(data[0], 0xFF, 4096); memset(data[1], 0x42, 4096); TEST(@"-[addItem:]", R([array[0] addItem: data[0]]) && R([array[0] addItem: data[1]])) TEST(@"-[itemAtIndex:]", !memcmp([array[0] itemAtIndex: 0], data[0], 4096) && !memcmp([array[0] itemAtIndex: 1], data[1], 4096)) TEST(@"-[lastItem]", !memcmp([array[0] lastItem], data[1], 4096)) TEST(@"-[count]", [array[0] count] == 2) other = (class == [OFDataArray class] ? [OFBigDataArray class] : [OFDataArray class]); TEST(@"-[isEqual:]", (array[1] = [other dataArrayWithItemSize: 4096]) && R([array[1] addNItems: [array[0] count] fromCArray: [array[0] cArray]]) && [array[1] isEqual: array[0]] && R([array[1] removeNItems: 1]) && ![array[0] isEqual: array[1]]) TEST(@"-[copy]", (array[1] = [[array[0] copy] autorelease]) && [array[0] isEqual: array[1]]) array[2] = [OFDataArray dataArray]; array[3] = [OFDataArray dataArray]; [array[2] addItem: "a"]; [array[2] addItem: "a"]; [array[3] addItem: "z"]; TEST(@"-[compare]", [array[0] compare: array[1]] == 0 && R([array[1] removeNItems: 1]) && [array[0] compare: array[1]] == OF_ORDERED_DESCENDING && [array[1] compare: array[0]] == OF_ORDERED_ASCENDING && [array[2] compare: array[3]] == OF_ORDERED_ASCENDING) TEST(@"-[hash]", [array[0] hash] == 0x634A529F) array[0] = [class dataArray]; [array[0] addNItems: 6 fromCArray: "abcdef"]; TEST(@"-[removeNItems:]", R([array[0] removeNItems: 1]) && [array[0] count] == 5 && !memcmp([array[0] cArray], "abcde", 5)) TEST(@"-[removeNItems:atIndex:]", R([array[0] removeNItems: 2 atIndex: 1]) && [array[0] count] == 3 && !memcmp([array[0] cArray], "ade", 3)) TEST(@"-[addNItems:atIndex:]", R([array[0] addNItems: 2 fromCArray: "bc" atIndex: 1]) && [array[0] count] == 5 && !memcmp([array[0] cArray], "abcde", 5)) TEST(@"-[MD5Hash]", [[array[0] MD5Hash] isEqual: [@"abcde" MD5Hash]]) TEST(@"-[SHA1Hash]", [[array[0] SHA1Hash] isEqual: [@"abcde" SHA1Hash]]) TEST(@"-[stringByBase64Encoding]", [[array[0] stringByBase64Encoding] isEqual: @"YWJjZGU="]) TEST(@"+[dataArrayWithBase64EncodedString:]", !memcmp([[class dataArrayWithBase64EncodedString: @"YWJjZGU="] cArray], "abcde", 5)) TEST(@"Building strings", (array[0] = [class dataArray]) && R([array[0] addNItems: 6 fromCArray: (void*)str]) && R([array[0] addItem: ""]) && !strcmp([array[0] cArray], str)) EXPECT_EXCEPTION(@"Detect out of range in -[itemAtIndex:]", OFOutOfRangeException, [array[0] itemAtIndex: [array[0] count]]) EXPECT_EXCEPTION(@"Detect out of range in -[addNItems:fromCArray:]", OFOutOfRangeException, [array[0] addNItems: SIZE_MAX fromCArray: NULL]) EXPECT_EXCEPTION(@"Detect out of range in -[removeNItems:]", OFOutOfRangeException, [array[0] removeNItems: [array[0] count] + 1]) } - (void)dataArrayTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; module = @"OFDataArray"; [self dataArrayTestsWithClass: [OFDataArray class]]; module = @"OFBigDataArray"; [self dataArrayTestsWithClass: [OFBigDataArray class]]; [pool drain]; } @end