1/* TestVersit.m - this file is part of $PROJECT_NAME_HERE$ 2 * 3 * Copyright (C) 2011 Inverse inc 4 * 5 * Author: Wolfgang Sourdeau <wsourdeau@inverse.ca> 6 * 7 * This file is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2, or (at your option) 10 * any later version. 11 * 12 * This file is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; see the file COPYING. If not, write to 19 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 20 * Boston, MA 02111-1307, USA. 21 */ 22 23#import <NGCards/CardVersitRenderer.h> 24#import <NGCards/CardGroup.h> 25 26#import "SOGoTest.h" 27 28@interface TestVersit : SOGoTest 29@end 30 31@implementation TestVersit 32 33- (void) test_rendering 34{ 35 36#pragma clang diagnostic push 37#pragma clang diagnostic ignored "-Wobjc-string-compare" 38 39 CardElement *element; 40 CardVersitRenderer *renderer; 41 NSString *result; 42 NSString *error; 43 44 renderer = [CardVersitRenderer new]; 45 [renderer autorelease]; 46 47 /* 1. simple value */ 48 element = [CardElement elementWithTag: @"elem"]; 49 [element setSingleValue: @"value" forKey: @""]; 50 result = [renderer render: element]; 51 testEquals(result, @"ELEM:value\r\n"); 52 53 /* 2. two values */ 54 element = [CardElement elementWithTag: @"elem"]; 55 [element setSingleValue: @"value2" atIndex: 1 56 forKey: @""]; 57 [element setSingleValue: @"value1" atIndex: 0 58 forKey: @""]; 59 result = [renderer render: element]; 60 testEquals(result, @"ELEM:value1;value2\r\n"); 61 62 /* 3. one value with commma */ 63 element = [CardElement elementWithTag: @"elem"]; 64 [element setSingleValue: @"value1, with a comma" forKey: @""]; 65 result = [renderer render: element]; 66 testEquals(result, @"ELEM:value1\\, with a comma\r\n"); 67 68 /* 4. one value with a semicolon */ 69 element = [CardElement elementWithTag: @"elem"]; 70 [element setSingleValue: @"value1; with a semi-colon" forKey: @""]; 71 result = [renderer render: element]; 72 testEquals(result, @"ELEM:value1\\; with a semi-colon\r\n"); 73 74 /* 5. 3 named values: 75 1. with multiple subvalues 76 2. with commas 77 3. with semicolon */ 78 element = [CardElement elementWithTag: @"elem"]; 79 [element setValues: [NSArray arrayWithObjects: @"1", @"2", @"3", nil] 80 atIndex: 0 forKey: @"named1"]; 81 [element setSingleValue: @"1,2,3" forKey: @"named2"]; 82 [element setSingleValue: @"text1;text2" forKey: @"named3"]; 83 result = [renderer render: element]; 84 error = [NSString stringWithFormat: @"string '%@' elements not the same as in 'ELEM:NAMED1=1,2,3;NAMED2=1\\,2\\,3;NAMED3=text1\\;text2'", 85 result]; 86 testWithMessage([result isEqual: @"ELEM:NAMED1=1,2,3;NAMED2=1\\,2\\,3;NAMED3=text1\\;text2\r\n"] 87 || [result isEqual: @"ELEM:NAMED3=text1\\;text2;NAMED1=1,2,3;NAMED2=1\\,2\\,3\r\n"], 88 error); 89 90 /* 6. values with 1 ordered value with a whitespace starting subvalues */ 91 element = [CardElement elementWithTag: @"elem"]; 92 [element setValues: [NSArray arrayWithObjects: @"", @"1", nil] 93 atIndex: 0 forKey: @""]; 94 result = [renderer render: element]; 95 testEquals(result, @"ELEM:1\r\n"); 96 97 /* 7. values with 1 ordered value with a subvalue, a whitespace and another subvalue */ 98 element = [CardElement elementWithTag: @"elem"]; 99 [element setValues: [NSArray arrayWithObjects: @"1", @"", @"2", nil] 100 atIndex: 0 forKey: @""]; 101 result = [renderer render: element]; 102 testEquals(result, @"ELEM:1,2\r\n"); 103 104 /* 8.a. values with 1 empty ordered value and another non-empty one */ 105 element = [CardElement elementWithTag: @"elem"]; 106 [element setValues: [NSArray arrayWithObjects: nil] 107 atIndex: 0 forKey: @""]; 108 [element setValues: [NSArray arrayWithObjects: @"1", nil] 109 atIndex: 1 forKey: @""]; 110 result = [renderer render: element]; 111 testEquals(result, @"ELEM:;1\r\n"); 112 113 /* 8.b. a variant thereof: array with spaces */ 114 [element setValues: [NSArray arrayWithObjects: @"", @"", nil] 115 atIndex: 0 forKey: @""]; 116 result = [renderer render: element]; 117 testEquals(result, @"ELEM:;1\r\n"); 118 119 /* 8.c. a variant thereof: nil array */ 120 [element setValues: nil atIndex: 0 forKey: @""]; 121 result = [renderer render: element]; 122 testEquals(result, @"ELEM:;1\r\n"); 123 124 /* 9. values with 1 non-empty ordered value and another empty one */ 125 element = [CardElement elementWithTag: @"elem"]; 126 [element setValues: [NSArray arrayWithObjects: @"1", nil] 127 atIndex: 0 forKey: @""]; 128 [element setValues: [NSArray arrayWithObjects: nil] 129 atIndex: 1 forKey: @""]; 130 result = [renderer render: element]; 131 testEquals(result, @"ELEM:1\r\n"); 132 133 /* 10. named values with 1 nil value, 1 empty value and another non-nil one */ 134 element = [CardElement elementWithTag: @"elem"]; 135 [element setSingleValue: nil forKey: @"empty"]; 136 [element setSingleValue: nil forKey: @"empty2"]; 137 [element setSingleValue: @"coucou" forKey: @"nonempty"]; 138 result = [renderer render: element]; 139 testEquals(result, @"ELEM:NONEMPTY=coucou\r\n"); 140 141 /** tests about parameters handling could be nice */ 142 143#pragma clang diagnostic pop 144 145} 146 147- (void) test_parsing 148{ 149 150#pragma clang diagnostic push 151#pragma clang diagnostic ignored "-Wobjc-string-compare" 152 153 CardGroup *group; 154 CardElement *element; 155 NSString *versit; 156 157 versit = @"BEGIN:GROUP1\r\nELEMENT:value\r\nEND:GROUP1"; 158 group = [CardGroup parseSingleFromSource: versit]; 159 testEquals([group versitString], versit); 160 element = [group firstChildWithTag: @"element"]; 161 testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); 162 163 versit = @"BEGIN:GROUP1\r\nN:value1;value2\r\nEND:GROUP1"; 164 group = [CardGroup parseSingleFromSource: versit]; 165 testEquals([group versitString], versit); 166 element = [group firstChildWithTag: @"n"]; 167 testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value1"); 168 testEquals([element flattenedValueAtIndex: 1 forKey: @""], @"value2"); 169 170 versit = @"BEGIN:GROUP1\r\nELEMENT:value\\, with comma\r\nEND:GROUP1"; 171 group = [CardGroup parseSingleFromSource: versit]; 172 testEquals([group versitString], versit); 173 element = [group firstChildWithTag: @"element"]; 174 testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value, with comma"); 175 176 versit = @"BEGIN:GROUP1\r\nELEMENT:value,with comma\r\nEND:GROUP1"; 177 group = [CardGroup parseSingleFromSource: versit]; 178 testEquals([group versitString], versit); 179 element = [group firstChildWithTag: @"element"]; 180 testEquals([element valuesAtIndex: 0 forKey: @""], ([NSArray arrayWithObjects: @"value", @"with comma", nil])); 181 182 versit = @"BEGIN:GROUP1\r\nN:NAMED1=subvalue;NAMED2=subvalue1,subvalue2\r\nEND:GROUP1"; 183 group = [CardGroup parseSingleFromSource: versit]; 184 /* we avoid this test here as nothing guarantees that the order of named 185 values will be preserved... */ 186 // testEquals([group versitString], versit); 187 element = [group firstChildWithTag: @"n"]; 188 testEquals([element flattenedValueAtIndex: 0 forKey: @"NAMED1"], @"subvalue"); 189 testEquals([element valuesAtIndex: 0 forKey: @"named2"], 190 ([NSArray arrayWithObjects: @"subvalue1", @"subvalue2", nil])); 191 192 versit = @"BEGIN:GROUP1\r\nELEMENT;PARAM1=test:value\r\nEND:GROUP1"; 193 group = [CardGroup parseSingleFromSource: versit]; 194 testEquals([group versitString], versit); 195 element = [group firstChildWithTag: @"element"]; 196 testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); 197 testEquals([element value: 0 ofAttribute: @"param1"], @"test"); 198 199 versit = @"BEGIN:GROUP1\r\nELEMENT;PARAM1=paramvalue1,paramvalue2:value\r\nEND:GROUP1"; 200 group = [CardGroup parseSingleFromSource: versit]; 201 testEquals([group versitString], versit); 202 element = [group firstChildWithTag: @"element"]; 203 testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); 204 testEquals([element value: 0 ofAttribute: @"param1"], @"paramvalue1"); 205 testEquals([element value: 1 ofAttribute: @"param1"], @"paramvalue2"); 206 207 versit = @"BEGIN:GROUP1\r\nELEMENT;PARAM1=\"paramvalue1, with comma\":value\r\nEND:GROUP1"; 208 group = [CardGroup parseSingleFromSource: versit]; 209 testEquals([group versitString], versit); 210 element = [group firstChildWithTag: @"element"]; 211 testEquals([element flattenedValueAtIndex: 0 forKey: @""], @"value"); 212 testEquals([element value: 0 ofAttribute: @"param1"], @"paramvalue1, with comma"); 213 214#pragma clang diagnostic pop 215 216} 217 218@end 219