1#import <Foundation/Foundation.h>
2
3#import "Testing.h"
4
5int main()
6{
7  NSAutoreleasePool   *arp = [NSAutoreleasePool new];
8  NSData        *data;
9  NSData        *ref;
10  NSString      *str1;
11  NSString      *str2;
12  NSString      *strEnc;
13
14  PASS_EXCEPTION([[NSData alloc] initWithBase64EncodedString: nil options: 0],
15    NSInvalidArgumentException, "nil argument causes exception");
16
17  data = [[NSData alloc] initWithBase64EncodedString: @"" options: 0];
18  ref = [NSData data];
19  PASS_EQUAL(data, ref, "base64 decoding vector 1")
20  [data release];
21
22  data = [[NSData alloc] initWithBase64EncodedString: @"Zg==" options: 0];
23  ref = [NSData dataWithBytes: "f" length: 1];
24  PASS_EQUAL(data, ref, "base64 decoding vector 2")
25  [data release];
26
27  data = [[NSData alloc] initWithBase64EncodedString: @"Zm8=" options: 0];
28  ref = [NSData dataWithBytes: "fo" length: 2];
29  PASS_EQUAL(data, ref, "base64 decoding vector 3")
30  [data release];
31
32  data = [[NSData alloc] initWithBase64EncodedString: @"Zm9v" options: 0];
33  ref = [NSData dataWithBytes: "foo" length: 3];
34  PASS_EQUAL(data, ref, "base64 decoding vector 4")
35  [data release];
36
37  data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYg==" options: 0];
38  ref = [NSData dataWithBytes: "foob" length: 4];
39  PASS_EQUAL(data, ref, "base64 decoding vector 5")
40  [data release];
41
42  data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYmE=" options: 0];
43  ref = [NSData dataWithBytes: "fooba" length: 5];
44  PASS_EQUAL(data, ref, "base64 decoding vector 6")
45  [data release];
46
47  data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYmE==" options: 0];
48  ref = [NSData dataWithBytes: "fooba" length: 5];
49  PASS_EQUAL(data, ref, "base64 decoding vector 6 with 1 extra padding")
50  [data release];
51
52  data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYmE====="
53    options: 0];
54  ref = [NSData dataWithBytes: "fooba" length: 5];
55  PASS_EQUAL(data, ref, "base64 decoding vector 6 with 4 extra padding")
56  [data release];
57
58  data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYmFy" options: 0];
59  ref = [NSData dataWithBytes: "foobar" length: 6];
60  PASS_EQUAL(data, ref, "base64 decoding vector 7")
61  [data release];
62
63  data = [[NSData alloc] initWithBase64EncodedString: @"Zm9vYmFy====="
64    options: 0];
65  ref = [NSData dataWithBytes: "foobar\0" length: 7];
66  PASS_EQUAL(data, ref, "base64 decoding excess padding gives single nul byte")
67  [data release];
68
69  data = [[NSData alloc] initWithBase64EncodedString: @"Zm9v YmFy" options: 0];
70  PASS_EQUAL(data, nil, "base64 decoding with space returns nil")
71  [data release];
72
73  data = [[NSData alloc] initWithBase64EncodedString: @"Zm9v YmFy"
74    options: NSDataBase64DecodingIgnoreUnknownCharacters];
75  ref = [NSData dataWithBytes: "foobar" length: 6];
76  PASS_EQUAL(data, ref, "base64 decoding vector 8")
77  [data release];
78
79  str1 = @"In principio creavit Deus caelum et terram.\nTerra autem erat inanis et vacua, et tenebrae super faciem abyssi, et spiritus Dei ferebatur super aquas.\nDixitque Deus: \"Fiat lux\". Et facta est lux.";
80  data = [str1 dataUsingEncoding: NSASCIIStringEncoding];
81  strEnc = [data base64EncodedStringWithOptions:0];
82  data = [[NSData alloc] initWithBase64EncodedString: strEnc options: 0];
83  str2 = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding];
84  PASS_EQUAL(str1, str2, "Encode / Decode no lines")
85  [str2 release];
86
87  str1 = @"In principio creavit Deus caelum et terram.\nTerra autem erat inanis et vacua, et tenebrae super faciem abyssi, et spiritus Dei ferebatur super aquas.\nDixitque Deus: \"Fiat lux\". Et facta est lux.";
88  data = [str1 dataUsingEncoding: NSASCIIStringEncoding];
89  strEnc = [data base64EncodedStringWithOptions: (NSDataBase64Encoding64CharacterLineLength | NSDataBase64EncodingEndLineWithLineFeed)];
90  data = [[NSData alloc] initWithBase64EncodedString: strEnc
91    options: NSDataBase64DecodingIgnoreUnknownCharacters];
92  str2 = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding];
93  PASS_EQUAL(str1, str2, "Encode / Decode 64 - LF")
94  [str2 release];
95
96  str1 = @"In principio creavit Deus caelum et terram.\nTerra autem erat inanis et vacua, et tenebrae super faciem abyssi, et spiritus Dei ferebatur super aquas.\nDixitque Deus: \"Fiat lux\". Et facta est lux.";
97  data = [str1 dataUsingEncoding: NSASCIIStringEncoding];
98  strEnc = [data base64EncodedStringWithOptions: (NSDataBase64Encoding76CharacterLineLength | NSDataBase64EncodingEndLineWithLineFeed)];
99  data = [[NSData alloc] initWithBase64EncodedString: strEnc
100    options: NSDataBase64DecodingIgnoreUnknownCharacters];
101  str2 = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding];
102  PASS_EQUAL(str1, str2, "Encode / Decode 76 - LF")
103  [str2 release];
104
105  str1 = @"In principio creavit Deus caelum et terram.\nTerra autem erat inanis et vacua, et tenebrae super faciem abyssi, et spiritus Dei ferebatur super aquas.\nDixitque Deus: \"Fiat lux\". Et facta est lux.";
106  data = [str1 dataUsingEncoding: NSASCIIStringEncoding];
107  strEnc = [data base64EncodedStringWithOptions: (NSDataBase64Encoding64CharacterLineLength | NSDataBase64EncodingEndLineWithCarriageReturn)];
108  data = [[NSData alloc] initWithBase64EncodedString: strEnc
109    options: NSDataBase64DecodingIgnoreUnknownCharacters];
110  str2 = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding];
111  PASS_EQUAL(str1, str2, "Encode / Decode 64 - CR")
112  [str2 release];
113
114  str1 = @"In principio creavit Deus caelum et terram.\nTerra autem erat inanis et vacua, et tenebrae super faciem abyssi, et spiritus Dei ferebatur super aquas.\nDixitque Deus: \"Fiat lux\". Et facta est lux.";
115  data = [str1 dataUsingEncoding: NSASCIIStringEncoding];
116  strEnc = [data base64EncodedStringWithOptions: NSDataBase64Encoding64CharacterLineLength];
117  data = [[NSData alloc] initWithBase64EncodedString: strEnc
118    options: NSDataBase64DecodingIgnoreUnknownCharacters];
119  str2 = [[NSString alloc] initWithData: data encoding: NSASCIIStringEncoding];
120  PASS_EQUAL(str1, str2, "Encode / Decode 64 - implicit CR LF")
121  [str2 release];
122
123  data = [[NSData alloc] initWithBase64EncodedString:
124    @"Yml0bWFya2V0cyB1c2VyIGluZGVudGl0eQ==\n"
125    options: NSDataBase64DecodingIgnoreUnknownCharacters];
126  ref = [NSData dataWithBytes: "bitmarkets user indentity" length: 25];
127  PASS_EQUAL(data, ref, "base64 decoding Yml0bWFya2V0cyB1c2VyIGluZGVudGl0eQ==")
128  [data release];
129
130  [arp release]; arp = nil;
131  return 0;
132}
133