/*
* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017
* Jonathan Schleifer <js@heap.zone>
*
* 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"
#import "OFSet.h"
#import "OFArray.h"
#import "OFNumber.h"
#import "OFAutoreleasePool.h"
#import "OFEnumerationMutationException.h"
#import "TestsAppDelegate.h"
static OFString *module = @"OFSet";
@implementation TestsAppDelegate (OFSetTests)
- (void)setTests
{
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
OFSet *set1, *set2;
OFMutableSet *mutableSet;
bool ok;
size_t i;
TEST(@"+[setWithArray:]",
(set1 = [OFSet setWithArray: [OFArray arrayWithObjects: @"foo",
@"bar", @"baz", @"foo", @"x", nil]]))
TEST(@"+[setWithObjects:]",
(set2 = [OFSet setWithObjects: @"foo", @"bar", @"baz", @"bar", @"x",
nil]))
TEST(@"-[isEqual:]", [set1 isEqual: set2])
TEST(@"-[hash]", [set1 hash] == [set2 hash])
TEST(@"-[description]",
[[set1 description]
isEqual: @"{(\n\tx,\n\tbar,\n\tfoo,\n\tbaz\n)}"] &&
[[set1 description] isEqual: [set2 description]])
TEST(@"-[copy]", [set1 isEqual: [[set1 copy] autorelease]])
TEST(@"-[mutableCopy]",
(mutableSet = [[set1 mutableCopy] autorelease]));
TEST(@"-[addObject:]",
R([mutableSet addObject: @"baz"]) && [mutableSet isEqual: set2] &&
R([mutableSet addObject: @"y"]) && [mutableSet isEqual:
[OFSet setWithObjects: @"foo", @"bar", @"baz", @"x", @"y", nil]])
TEST(@"-[removeObject:]",
R([mutableSet removeObject: @"y"]) && [mutableSet isEqual: set1])
TEST(@"-[isSubsetOfSet:]",
R([mutableSet removeObject: @"foo"]) &&
[mutableSet isSubsetOfSet: set1] &&
![set1 isSubsetOfSet: mutableSet]);
TEST(@"-[intersectsSet:]",
[(set2 = [OFSet setWithObjects: @"x", nil]) intersectsSet: set1] &&
[set1 intersectsSet: set2] &&
![[OFSet setWithObjects: @"1", nil] intersectsSet: set1]);
TEST(@"-[minusSet:]",
R([mutableSet minusSet: [OFSet setWithObjects: @"x", nil]]) &&
[mutableSet isEqual: [OFSet setWithObjects: @"baz", @"bar", nil]])
TEST(@"-[intersectSet:]",
R([mutableSet intersectSet: [OFSet setWithObjects: @"baz",
nil]]) && [mutableSet isEqual: [OFSet setWithObjects: @"baz",
nil]])
TEST(@"-[unionSet:]",
R([mutableSet unionSet: [OFSet setWithObjects: @"x", @"bar",
nil]]) && [mutableSet isEqual: [OFSet setWithObjects: @"baz",
@"bar", @"x", nil]])
ok = true;
i = 0;
for (OFString *s in set1) {
switch (i) {
case 0:
if (![s isEqual: @"x"])
ok = false;
break;
case 1:
if (![s isEqual: @"bar"])
ok = false;
break;
case 2:
if (![s isEqual: @"foo"])
ok = false;
break;
case 3:
if (![s isEqual: @"baz"])
ok = false;
break;
}
i++;
}
if (i != 4)
ok = false;
TEST(@"Fast enumeration", ok)
ok = false;
@try {
for (OFString *s in mutableSet)
[mutableSet removeObject: s];
} @catch (OFEnumerationMutationException *e) {
ok = true;
}
TEST(@"Detection of mutation during Fast Enumeration", ok);
TEST(@"-[valueForKey:]",
[(set1 = [[OFSet setWithObjects: @"a", @"ab", @"abc", @"b", nil]
valueForKey: @"length"]) isEqual: [OFSet setWithObjects:
[OFNumber numberWithSize: 1], [OFNumber numberWithSize: 2],
[OFNumber numberWithSize: 3], nil]] &&
[[set1 valueForKey: @"@count"] isEqual:
[OFNumber numberWithSize: 3]])
[pool drain];
}
@end