bindings/Cocoa/MYOttoman_test.m
author Jens Alfke <jens@mooseyard.com>
Thu Sep 24 21:47:06 2009 -0700 (2009-09-24)
changeset 6 f2cd752db494
permissions -rw-r--r--
Initial Cocoa (Objective-C) API.
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
}