jens@6
|
1 |
//
|
jens@6
|
2 |
// MYOttoman_test.m
|
jens@6
|
3 |
// Ottoman
|
jens@6
|
4 |
//
|
jens@6
|
5 |
// Created by Jens Alfke on 9/24/09.
|
jens@6
|
6 |
// Copyright 2009 Jens Alfke. All rights reserved.
|
jens@6
|
7 |
//
|
jens@6
|
8 |
|
jens@6
|
9 |
#import "MYOttoman.h"
|
jens@6
|
10 |
#import "MYVersionDictionary.h"
|
jens@6
|
11 |
|
jens@6
|
12 |
#import "Test.h"
|
jens@6
|
13 |
|
jens@6
|
14 |
static NSData* dataOf (NSString *str) {
|
jens@6
|
15 |
return [str dataUsingEncoding: NSUTF8StringEncoding];
|
jens@6
|
16 |
}
|
jens@6
|
17 |
|
jens@6
|
18 |
/*
|
jens@6
|
19 |
static NSString* stringOf (id data) {
|
jens@6
|
20 |
if (!data)
|
jens@6
|
21 |
return nil;
|
jens@6
|
22 |
CAssert([data isKindOfClass: [NSData class]], @"stringOf expected NSData, got %@", [data class]);
|
jens@6
|
23 |
NSString *str = [[[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding] autorelease];
|
jens@6
|
24 |
CAssert(str!=nil, @"Bad data (couldn't decode UTF-8): %@", data);
|
jens@6
|
25 |
return str;
|
jens@6
|
26 |
}
|
jens@6
|
27 |
*/
|
jens@6
|
28 |
|
jens@6
|
29 |
static void checkFile (NSString *path) {
|
jens@6
|
30 |
NSError *error;
|
jens@6
|
31 |
NSDictionary *fileInfo = [[NSFileManager defaultManager] attributesOfItemAtPath: path error: &error];
|
jens@6
|
32 |
CAssert(fileInfo, @"Couldn't get info for %@: %@", path,error);
|
jens@6
|
33 |
CAssert([fileInfo fileSize] >= 512, @"Unexpected file size %lld", [fileInfo fileSize]);
|
jens@6
|
34 |
NSTimeInterval age = - [[fileInfo fileModificationDate] timeIntervalSinceNow];
|
jens@6
|
35 |
CAssert(age < 60.0, @"File %@ is too old: %.1lf sec", path,age);
|
jens@6
|
36 |
}
|
jens@6
|
37 |
|
jens@6
|
38 |
|
jens@6
|
39 |
TestCase(CreateMYOttoman) {
|
jens@6
|
40 |
MYOttoman *o = [[MYOttoman alloc] init];
|
jens@6
|
41 |
MYCurrentVersionDictionary *cur = o.currentVersion;
|
jens@6
|
42 |
CAssertEq(o.lastVersion,nil);
|
jens@6
|
43 |
|
jens@6
|
44 |
[cur setObject: dataOf(@"first value") forKey: dataOf(@"first key")];
|
jens@6
|
45 |
[cur setObject: dataOf(@"second value") forKey: dataOf(@"second key")];
|
jens@6
|
46 |
[cur setObject: dataOf(@"third value") forKey: dataOf(@"third key")];
|
jens@6
|
47 |
[cur removeObjectForKey: dataOf(@"third key")];
|
jens@6
|
48 |
[cur removeObjectForKey: dataOf(@"bogus")];
|
jens@6
|
49 |
|
jens@6
|
50 |
CAssertEq(cur.count, 2);
|
jens@6
|
51 |
CAssertEqual([cur objectForKey: dataOf(@"first key")], dataOf(@"first value"));
|
jens@6
|
52 |
CAssertEqual([cur objectForKey: dataOf(@"second key")], dataOf(@"second value"));
|
jens@6
|
53 |
CAssertEqual([cur objectForKey: dataOf(@"third key")], nil);
|
jens@6
|
54 |
|
jens@6
|
55 |
NSError *error;
|
jens@6
|
56 |
if (![o saveAs: [NSURL fileURLWithPath: @"/tmp/myottomantest.ottoman"]
|
jens@6
|
57 |
overwriteAllowed: YES error: &error])
|
jens@6
|
58 |
CAssert(NO, @"saveAs: failed: %@", error);
|
jens@6
|
59 |
checkFile(@"/tmp/myottomantest.ottoman");
|
jens@6
|
60 |
|
jens@6
|
61 |
MYVersionDictionary *last = o.lastVersion;
|
jens@6
|
62 |
CAssert(last, @"lastVersion is nil after save");
|
jens@6
|
63 |
CAssertEq(last.generation,0);
|
jens@6
|
64 |
CAssertEqual([last objectForKey: dataOf(@"first key")], dataOf(@"first value"));
|
jens@6
|
65 |
CAssertEqual([last objectForKey: dataOf(@"second key")], dataOf(@"second value"));
|
jens@6
|
66 |
CAssertEqual([last objectForKey: dataOf(@"third key")], nil);
|
jens@6
|
67 |
|
jens@6
|
68 |
[cur setObject: dataOf(@"fourth value") forKey: dataOf(@"fourth key")];
|
jens@6
|
69 |
[cur setObject: dataOf(@"new first value") forKey: dataOf(@"first key")];
|
jens@6
|
70 |
[cur removeObjectForKey: dataOf(@"second key")];
|
jens@6
|
71 |
CAssertEq(cur.count, 2);
|
jens@6
|
72 |
CAssertEqual([cur objectForKey: dataOf(@"first key")], dataOf(@"new first value"));
|
jens@6
|
73 |
CAssertEqual([cur objectForKey: dataOf(@"second key")], nil);
|
jens@6
|
74 |
CAssertEqual([cur objectForKey: dataOf(@"fourth key")], dataOf(@"fourth value"));
|
jens@6
|
75 |
|
jens@6
|
76 |
if (![o save: &error])
|
jens@6
|
77 |
CAssert(NO, @"save: failed: %@", error);
|
jens@6
|
78 |
|
jens@6
|
79 |
CAssertEqual([last objectForKey: dataOf(@"first key")], dataOf(@"first value"));
|
jens@6
|
80 |
CAssertEqual([last objectForKey: dataOf(@"second key")], dataOf(@"second value"));
|
jens@6
|
81 |
CAssertEqual([last objectForKey: dataOf(@"third key")], nil);
|
jens@6
|
82 |
|
jens@6
|
83 |
last = o.lastVersion;
|
jens@6
|
84 |
CAssertEq(last.generation,1);
|
jens@6
|
85 |
CAssertEqual([last objectForKey: dataOf(@"first key")], dataOf(@"new first value"));
|
jens@6
|
86 |
CAssertEqual([last objectForKey: dataOf(@"second key")], nil);
|
jens@6
|
87 |
CAssertEqual([last objectForKey: dataOf(@"third key")], nil);
|
jens@6
|
88 |
CAssertEqual([last objectForKey: dataOf(@"fourth key")], dataOf(@"fourth value"));
|
jens@6
|
89 |
|
jens@6
|
90 |
[o close];
|
jens@6
|
91 |
[o release];
|
jens@6
|
92 |
|
jens@6
|
93 |
o = [[MYOttoman alloc] initWithURL: [NSURL fileURLWithPath: @"/tmp/myottomantest.ottoman"]
|
jens@6
|
94 |
writeable: NO error: &error];
|
jens@6
|
95 |
CAssert(o, @"Failed to re-open Ottoman: %@", error);
|
jens@6
|
96 |
CAssertEq(o.currentVersion, nil);
|
jens@6
|
97 |
last = o.lastVersion;
|
jens@6
|
98 |
CAssertEq(last.generation,1);
|
jens@6
|
99 |
CAssertEqual([last objectForKey: dataOf(@"first key")], dataOf(@"new first value"));
|
jens@6
|
100 |
CAssertEqual([last objectForKey: dataOf(@"second key")], nil);
|
jens@6
|
101 |
CAssertEqual([last objectForKey: dataOf(@"third key")], nil);
|
jens@6
|
102 |
CAssertEqual([last objectForKey: dataOf(@"fourth key")], dataOf(@"fourth value"));
|
jens@6
|
103 |
|
jens@6
|
104 |
MYVersionDictionary *prev = last.previousVersion;
|
jens@6
|
105 |
CAssert(prev!=nil);
|
jens@6
|
106 |
CAssertEq(prev.generation,0);
|
jens@6
|
107 |
CAssertEq(prev.previousVersion,nil);
|
jens@6
|
108 |
CAssertEqual([prev objectForKey: dataOf(@"first key")], dataOf(@"first value"));
|
jens@6
|
109 |
CAssertEqual([prev objectForKey: dataOf(@"second key")], dataOf(@"second value"));
|
jens@6
|
110 |
CAssertEqual([prev objectForKey: dataOf(@"third key")], nil);
|
jens@6
|
111 |
|
jens@6
|
112 |
[o close];
|
jens@6
|
113 |
[o release];
|
jens@6
|
114 |
}
|
jens@6
|
115 |
|
jens@6
|
116 |
|
jens@6
|
117 |
int main(int argc, const char**argv) {
|
jens@6
|
118 |
const char* testArgs[2] = {"", "Test_All"};
|
jens@6
|
119 |
RunTestCases(2,testArgs);
|
jens@6
|
120 |
return 0;
|
jens@6
|
121 |
}
|