Merge pull request #213 from zentyal/jamor/unittest-merge

Add RTFHandler unittest
This commit is contained in:
Jesús García Sáez
2016-01-12 18:35:43 +01:00
20 changed files with 1005 additions and 107 deletions
+9 -1
View File
@@ -28,6 +28,8 @@
//
//
//
@class RTFFontTable;
@interface RTFHandler : NSObject
{
NSMapTable *_charsets;
@@ -41,6 +43,11 @@
- (id) initWithData: (NSData *) theData;
- (NSMutableData *) parse;
- (RTFFontTable *) parseFontTable;
- (void) mangleInternalStateWithBytesPtr: (const char*) newBytes
andCurrentPos: (int) newCurrentPos;
@end
//
@@ -84,6 +91,7 @@
unsigned int index;
}
- (NSString *) description;
@end
//
@@ -97,8 +105,8 @@
- (void) addFontInfo: (RTFFontInfo *) theFontInfo
atIndex: (unsigned int ) theIndex;
- (RTFFontInfo *) fontInfoAtIndex: (unsigned int ) theIndex;
- (NSString *) description;
@end
+13
View File
@@ -21,6 +21,7 @@
#include "RTFHandler.h"
#include <Foundation/NSValue.h>
#include <Foundation/NSException.h>
//
// Useful macros
@@ -352,6 +353,7 @@ const unsigned short ansicpg874[256] = {
RTFFontInfo *fontInfo;
description = [NSMutableString stringWithFormat: @"Number of fonts: %u\n", [fontInfos count]];
enumerator = [fontInfos objectEnumerator];
while ((fontInfo = [enumerator nextObject]))
{
@@ -563,6 +565,9 @@ static void _init_fontCws_table()
[super dealloc];
}
/*
Returns pointer to the control word and in len pointer its length including numeric argument
*/
- (const char *) parseControlWord: (unsigned int *) len
{
const char *start, *end;
@@ -1457,4 +1462,12 @@ inline static void parseUl(RTFHandler *self, BOOL hasArg, int arg, RTFFormatting
return [_html autorelease];
}
/* This method is for ease of testing and should not be used in normal operations */
- (void) mangleInternalStateWithBytesPtr: (const char*) newBytes
andCurrentPos: (int) newCurrentPos
{
_bytes = newBytes;
_current_pos = newCurrentPos;
}
@end
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,21 @@
{\rtf1\ansi\deff3\adeflang1025
{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Times New Roman;}{\f4\fs
wiss\fprq2\fcharset0 Arial;}{\f5\fnil\fprq2\fcharset1 Ubuntu;}{\f6\fnil\fprq2\fcharset0 DejaVu Sans;}{\f7\fnil\fprq2\fcharset0 Lohit Hindi;}{\f8\fnil\fprq0\fcharset1 Lohit Hindi
;}}
{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
{\stylesheet{\s0\snext0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033 Normal;}
{\s15\sbasedon0\snext16\sb240\sa120\keepn\dbch\af6\dbch\af7\afs28\loch\f4\fs28 Heading;}
{\s16\sbasedon0\snext16\sb0\sa120 Text Body;}
{\s17\sbasedon16\snext17\sb0\sa120\dbch\af8 List;}
{\s18\sbasedon0\snext18\sb120\sa120\noline\i\dbch\af8\afs24\ai\fs24 Caption;}
{\s19\sbasedon0\snext19\noline\dbch\af8 Index;}
}{\info{\creatim\yr2014\mo8\dy4\hr16\min16}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67175170}}\deftab709
\viewscale100
{\*\pgdsctbl
{\pgdsc0\pgdscuse451\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Default Style;}}
\formshade\paperh16838\paperw11906\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\marg
bsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
\pgndec\pard\plain \s0\nowidctlpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf0\kerning1\dbch\af6\langfe2052\dbch\af7\afs24\alang1081\loch\f3\fs24\lang1033{\rtlch \ltrch\loch\l
och\f5000
foobar}
\par }
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
+9 -3
View File
@@ -21,19 +21,24 @@ $(TEST_TOOL)_OBJC_FILES += \
\
TestSBJsonParser.m \
\
TestNGMimeAddressHeaderFieldGenerator.m \
TestNGMimeHeaderFieldGenerator.m \
TestNGMimeMessageGenerator.m \
\
TestNSData+Crypto.m \
TestNSString+Crypto.m \
TestNSString+URLEscaping.m \
TestNSString+Utilities.m \
TestNGMailAddressParser.m
TestNGMailAddressParser.m \
\
TestRTFHandler.m \
../../OpenChange/RTFHandler.m
# I don't know how to link against -l:SOGoBackend \
undefined reference to `__objc_class_name_SOGoMailFolder'
TEST_TOOL_NAME = $(TEST_TOOL)
$(TEST_TOOL)_CPPFLAGS += \
-Wall -D_GNU_SOURCE -I../../SOPE/ -I../../SoObjects/ -I../../UI/
-Wall -D_GNU_SOURCE -I../../SOPE/ -I../../SoObjects/ -I../../UI/ -I../../OpenChange
ADDITIONAL_LIB_DIRS += \
-L../../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo -L../../SOPE/NGCards/obj -L../../SOPE/GDLContentStore/obj -lSOGo -lNGMime -lNGCards -lGDLContentStore -lNGExtensions -lSBJson -lobjc \
@@ -47,3 +52,4 @@ include $(GNUSTEP_MAKEFILES)/test-tool.make
check :: $(TEST_TOOL)
./obj/sogo-tests
+1 -1
View File
@@ -32,7 +32,7 @@
#import "SOGoTestRunner.h"
#define EXPECTED_FAILURES 3
#define EXPECTED_FAILURES 0
@implementation SOGoTestRunner
+6 -7
View File
@@ -36,7 +36,7 @@
@"johndown@test.com", // email alone
@"<johndown@test.com>", // email between brackets
@"\"<johndown@test.com>\" <johndown@test.com>", // doubled
// @"\"johndown@inverse.ca\" <johndown@test.com>", // with and without br.
@"\"johndown@inverse.ca\" <johndown@test.com>", // with and without br.
@"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla?= <johndown@test.com>", // accented full name
@"=?utf-8?q?=C3=80=C3=B1in=C3=A9oblabla_Bla_Bl=C3=A9?= <johndown@test.com>", // accented and multiword
@"John Down \"Bla Bla\" <johndown@test.com>", // partly quoted
@@ -45,14 +45,13 @@
@"john", // name only, no domain
nil ];
NSArray *expectedAddresses = [NSArray arrayWithObjects:
@"johndown@test.com", // email alone
@"johndown@test.com", // email between brackets
@"johndown@test.com", // email alone
@"johndown@test.com", // email between brackets
@"johndown@test.com", // doubled
// @"\"johndown@inverse.ca\" <johndown@test.com>", // with and without br.
@"johndown@test.com", // with and without br.
@"johndown@test.com", // accented full name
@"johndown@test.com", // accented
// and multiword
/* NOTE: the following are wrong but tolerated for now */
@"johndown@test.com", // partly quoted
@"johndown@test.com", // full name + email
@@ -72,8 +71,8 @@
parsedRecipient = [parser parse];
result = [parsedRecipient address];
error = [NSString
stringWithFormat: @"received '%@' instead of '%@' for '%@'",
result, currentExp, rawAddress];
stringWithFormat: @"[%d] received '%@' instead of '%@' for '%@'",
count, result, currentExp, rawAddress];
testWithMessage([result isEqualToString: currentExp], error);
}
}
+106
View File
@@ -0,0 +1,106 @@
/* TestNGMimeHeaderFieldGenerator.m - this file is part of SOGo
*
* Copyright (C) 2015 Jesús García Sáez <jgarcia@zentyal.com>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import "SOGoTest.h"
#import <NGMime/NGMimeHeaderFieldGenerator.h>
@interface TestNGMimeHeaderFieldGenerator : SOGoTest
@end
@implementation TestNGMimeHeaderFieldGenerator
/*
This test is actually for SOPE library, not SOGo
*/
- (void) test_encodeQPsubject
{
NSArray *cases = [NSArray arrayWithObjects:
[NSArray arrayWithObjects: @"hello", @"hello", nil],
[NSArray arrayWithObjects: @"holá", @"=?utf-8?q?hol=C3=A1?=", nil],
[NSArray arrayWithObjects:
@"АБВГДЕЁЖЗИАБВГДЕЁЖЗИАБВГДЕЁЖЗИАБВГДЕЁЖЗИ"
@"АБВГДЕЁЖЗИАБВГДЕЁЖЗИАБВГДЕЁЖЗИАБВГДЕЁЖЗИ",
@"=?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98?=\n"
@" =?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=90?=\n"
@" =?utf-8?q?=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=90=D0=91?=\n"
@" =?utf-8?q?=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=90=D0=91=D0=92?=\n"
@" =?utf-8?q?=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=90=D0=91=D0=92=D0=93?=\n"
@" =?utf-8?q?=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=90=D0=91=D0=92=D0=93=D0=94?=\n"
@" =?utf-8?q?=D0=95=D0=81=D0=96=D0=97=D0=98=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95?=\n"
@" =?utf-8?q?=D0=81=D0=96=D0=97=D0=98?=", nil],
[NSArray arrayWithObjects:
@"hello АБВ hi АБВ hi АБВ hi АБВ hi АБВ",
@"hello =?utf-8?q?=D0=90=D0=91=D0=92?= hi =?utf-8?q?=D0=90=D0=91=D0=92?= hi \n"
@" =?utf-8?q?=D0=90=D0=91=D0=92?= hi =?utf-8?q?=D0=90=D0=91=D0=92?= hi \n"
@" =?utf-8?q?=D0=90=D0=91=D0=92?=", nil],
[NSArray arrayWithObjects:
@"hello АБВ АБВ ",
@"hello =?utf-8?q?=D0=90=D0=91=D0=92?=\n"
@" =?utf-8?q?________________=D0=90=D0=91=D0=92?= ", nil],
[NSArray arrayWithObjects: @" hello", @" hello", nil],
[NSArray arrayWithObjects: @"hello ", @"hello ", nil],
[NSArray arrayWithObjects:
@"hello АБВ ",
@"hello =?utf-8?q?=D0=90=D0=91=D0=92?= ", nil],
[NSArray arrayWithObjects:
@"ьььььььььььььььььььььььььььььььььььььььььььььььььь"
@"ьььььььььььььььььььььььььььььььььььььььььььььььььь"
@"ьььььььььььььььььььььььььььььььььььььььььььььььььь"
@"ьььььььььььььььььььььььььььььььььььььььььььььььььь",
@"=?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C=D1=8C?=\n"
@" =?utf-8?q?=D1=8C=D1=8C=D1=8C?=", nil],
nil
];
NSArray *caseData;
for (caseData in cases)
{
NSString *input = [caseData objectAtIndex: 0];
NSString *expected = [caseData objectAtIndex: 1];
NSString *output = [NGMimeHeaderFieldGenerator encodeQuotedPrintableText: input];
BOOL testResult = [output isEqualToString: expected];
NSString *diff = [self stringFromDiffBetween: output and: expected];
NSString *testErrorMsg = [NSString stringWithFormat:
@">> For input `%@`\n>> We got `%@`\n>> Expected `%@`\n%@",
input, output, expected, diff];
testWithMessage (testResult, testErrorMsg);
}
}
@end
+70 -86
View File
@@ -19,113 +19,97 @@
#import "SOGoTest.h"
#import <NGMail/NGMimeMessageGenerator.h>
@interface TestNGMimeMessageGenerator : SOGoTest
@end
@implementation TestNGMimeMessageGenerator
/*
This test is actually for SOPE library, not SOGo
*/
- (void) test_generateDataForHeaderField_value
{
NGMimeMessageGenerator *generator;
NSArray *cases = [NSArray arrayWithObjects:
[NSArray arrayWithObjects: @"Message-ID", @"<CADCKkzo+9X1SniJFY3yc7YGafNrmAts419RmcqNkMzd-PBqNbA@mail.gmail.com>", @"<CADCKkzo+9X1SniJFY3yc7YGafNrmAts419RmcqNkMzd-PBqNbA@mail.gmail.com>", nil],
[NSArray arrayWithObjects: @"Content-Type",
@"text/plain; charset=utf-8; format=flowed",
@"text/plain; charset=utf-8; format=flowed",
nil],
[NSArray arrayWithObjects: @"X-FullHeaderOneHebrewOneLatin",
@"עs",
@"=?utf-8?q?=D7=A2s?=",
nil],
[NSArray arrayWithObjects: @"X-FullHeaderOneLatineOneHebrew",
@"",
@"=?utf-8?q?s=D7=A2?=",
nil],
[NSArray arrayWithObjects: @"X-FullHeaderOneCharacterHebrew",
@"ע",
@"=?utf-8?q?=D7=A2?=",
nil],
[NSArray arrayWithObjects: @"X-FullHeaderOneCharacterRussian",
@"Б",
@"=?utf-8?q?=D0=91?=",
nil],
[NSArray arrayWithObjects: @"X-FullHeaderParameter",
@"parameter=ע",
@"parameter==?utf-8?q?=D7=A2?=",
nil],
[NSArray arrayWithObjects: @"X-MixedHeaderParameters",
@"plain; parameter=ע; parameter-plain; parameter2=ea",
@"plain;\n parameter==?utf-8?q?=D7=A2?=;\n parameter-plain; parameter2=ea",
nil],
[NSArray arrayWithObjects: @"X-MixedHeaderAndNoParameter",
@"plain; parameter=ע; parameter-plain; ע",
@"plain;\n parameter==?utf-8?q?=D7=A2?=; parameter-plain;\n =?utf-8?q?=D7=A2?=",
nil],
[NSArray arrayWithObjects: @"X-MixedHeaderAndTwoParameter",
@"plain; parameter=ע; parameter-plain; z=ע",
@"plain;\n parameter==?utf-8?q?=D7=A2?=; parameter-plain;\n z==?utf-8?q?=D7=A2?=",
nil],
[NSArray arrayWithObjects: @"X-MixedHeaderExtrablanks",
@"plain; parameter=ע; parameter 2spaces; parameter2=ea",
@"plain;\n \\ parameter==?utf-8?q?=D7=A2?=;\n parameter 2spaces; parameter2=ea",
nil],
[NSArray arrayWithObjects: @"X-Encoded-Unbalanced-Paramter-Quote",
@"text/plain; name=\"ע",
@"text/plain;\n name==?utf-8?q?=22=D7=A2?=",
nil],
[NSArray arrayWithObjects: @"content-type",
@"text/plain; name=\"АБВГДЕЁЖЗИЙ, КЛМНОПРСТУФ y ЦЧШЩЪЫЬЭЮЯ.txt\"",
@"text/plain;\n name=\"=?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=99=2C_=D0=9A=D0=9B=D0=9C=D0=9D=D0=9E=D0=9F=D0=A0=D0=A1=D0=A2=D0=A3=D0=A4_y_=D0=A6=D0=A7=D0=A8=D0=A9=D0=AA=D0=AB=D0=AC=D0=AD=D0=AE=D0=AF=2Etxt?=\"",
nil],
[NSArray arrayWithObjects: @"content-disposition",
@"attachment; filename=\"АБВГДЕЁЖЗИЙ, КЛМНОПРСТУФ y ЦЧШЩЪЫЬЭЮЯ.txt\"",
@"attachment;\n filename=\"=?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=99=2C_=D0=9A=D0=9B=D0=9C=D0=9D=D0=9E=D0=9F=D0=A0=D0=A1=D0=A2=D0=A3=D0=A4_y_=D0=A6=D0=A7=D0=A8=D0=A9=D0=AA=D0=AB=D0=AC=D0=AD=D0=AE=D0=AF=2Etxt?=\"",
nil],
[NSArray arrayWithObjects: @"content-length", @"2912", @"2912", nil],
[NSArray arrayWithObjects: @"content-transfer-encoding", @"quoted-printable", @"quoted-printable", nil],
nil
];
NSEnumerator *enumerator;
NSArray *testCase;
[NSArray arrayWithObjects:@"Message-ID",
@"<CADCKkzo+9X1SniJFY3yc7YGafNrmAts419RmcqNkMzd-PBqNbA@mail.gmail.com>",
@"<CADCKkzo+9X1SniJFY3yc7YGafNrmAts419RmcqNkMzd-PBqNbA@mail.gmail.com>", nil],
[NSArray arrayWithObjects:@"Content-Type",
@"text/plain; charset=utf-8; format=flowed",
@"text/plain; charset=utf-8; format=flowed", nil],
[NSArray arrayWithObjects:@"X-FullHeaderOneHebrewOneLatin",
@"עs",
@"=?utf-8?q?=D7=A2s?=", nil],
[NSArray arrayWithObjects:@"X-FullHeaderOneLatineOneHebrew",
@"",
@"=?utf-8?q?s=D7=A2?=", nil],
[NSArray arrayWithObjects:@"X-FullHeaderOneCharacterHebrew",
@"ע",
@"=?utf-8?q?=D7=A2?=", nil],
[NSArray arrayWithObjects:@"X-FullHeaderOneCharacterRussian",
@"Б",
@"=?utf-8?q?=D0=91?=", nil],
[NSArray arrayWithObjects:@"X-FullHeaderParameter",
@"parameter=ע",
@"parameter==?utf-8?q?=D7=A2?=", nil],
[NSArray arrayWithObjects:@"X-MixedHeaderParameters",
@"plain; parameter=ע; parameter-plain; parameter2=ea",
@"plain;\n parameter==?utf-8?q?=D7=A2?=;\n parameter-plain; parameter2=ea", nil],
[NSArray arrayWithObjects:@"X-MixedHeaderAndNoParameter",
@"plain; parameter=ע; parameter-plain; ע",
@"plain;\n parameter==?utf-8?q?=D7=A2?=; parameter-plain;\n =?utf-8?q?=D7=A2?=", nil],
[NSArray arrayWithObjects:@"X-MixedHeaderAndTwoParameter",
@"plain; parameter=ע; parameter-plain; z=ע",
@"plain;\n parameter==?utf-8?q?=D7=A2?=; parameter-plain;\n z==?utf-8?q?=D7=A2?=", nil],
[NSArray arrayWithObjects:@"X-MixedHeaderExtrablanks",
@"plain; parameter=ע; parameter 2spaces; parameter2=ea",
@"plain;\n \\ parameter==?utf-8?q?=D7=A2?=;\n parameter 2spaces; parameter2=ea", nil],
[NSArray arrayWithObjects:@"X-Encoded-Unbalanced-Paramter-Quote",
@"text/plain; name=\"ע",
@"text/plain;\n name==?utf-8?q?=22=D7=A2?=", nil],
[NSArray arrayWithObjects:@"content-type",
@"text/plain; name=\"АБВГДЕЁЖЗИЙ, КЛМНОПРСТУФ y ЦЧШЩЪЫЬЭЮЯ.txt\"",
@"text/plain;\n name=\"=?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=99=2C_=D0=9A=D0"
@"=9B=D0=9C=D0=9D=D0=9E=D0=9F=D0=A0=D0=A1=D0=A2=D0=A3=D0=A4_y_=D0=A6=D0=A7=D0=A8"
@"=D0=A9=D0=AA=D0=AB=D0=AC=D0=AD=D0=AE=D0=AF=2Etxt?=\"", nil],
[NSArray arrayWithObjects:@"content-disposition",
@"attachment; filename=\"АБВГДЕЁЖЗИЙ, КЛМНОПРСТУФ y ЦЧШЩЪЫЬЭЮЯ.txt\"",
@"attachment;\n filename=\"=?utf-8?q?=D0=90=D0=91=D0=92=D0=93=D0=94=D0=95=D0=81=D0=96=D0=97=D0=98=D0=99=2C_=D0=9A=D0"
@"=9B=D0=9C=D0=9D=D0=9E=D0=9F=D0=A0=D0=A1=D0=A2=D0=A3=D0=A4_y_=D0=A6=D0=A7=D0=A8"
@"=D0=A9=D0=AA=D0=AB=D0=AC=D0=AD=D0=AE=D0=AF=2Etxt?=\"", nil],
[NSArray arrayWithObjects:@"content-length", @"2912", @"2912", nil],
[NSArray arrayWithObjects:@"content-transfer-encoding", @"quoted-printable", @"quoted-printable", nil],
nil
];
[NGMimeMessageGenerator initialize];
generator = [[NGMimeMessageGenerator alloc] init];
NGMimeMessageGenerator *generator = [[NGMimeMessageGenerator alloc] init];
[generator autorelease];
enumerator = [cases objectEnumerator];
while ((testCase = [enumerator nextObject]) != nil)
for (NSArray *testCase in cases)
{
NSData *result;
NSMutableData *resultWithNulByte;
NSString *header = [testCase objectAtIndex: 0];
NSData *headerData = [testCase objectAtIndex: 1];
NSString *expected = [testCase objectAtIndex: 2];
result = [generator generateDataForHeaderField: header
value: headerData];
if (result == nil)
result = [@"[nil]" dataUsingEncoding: NSUTF8StringEncoding];
NSData *result = [generator generateDataForHeaderField: header
value: headerData];
if (result == nil)
result = [@"[nil]" dataUsingEncoding: NSUTF8StringEncoding];
resultWithNulByte = [result mutableCopy];
[resultWithNulByte appendBytes: "\0" length: 1];
NSMutableData *resultWithNulByte = [result mutableCopy];
[resultWithNulByte appendBytes: "\0" length: 1];
NSString *resultString = [NSString stringWithCString:[resultWithNulByte bytes]];
BOOL testResult = [resultString isEqualToString: expected];
NSString *diff = [self stringFromDiffBetween: [NSString stringWithString: resultString]
and: [NSString stringWithString: expected]];
NSString *testErrorMsg = [NSString
stringWithFormat: @">> For %@ header received:\n%@[END]\n>> instead of:\n%@[END]\n>> for:\n%@\n>> diff:\n%@\n>> lengthReceived: %lu lengthExpected: %lu",
header,
resultString,
expected,
headerData,
diff,
[resultString length],
[expected length]
];
NSString *diff = [self stringFromDiffBetween: resultString and: expected];
NSString *testErrorMsg = [NSString stringWithFormat:
@">> For %@ header received:\n%@[END]\n"
@">> instead of:\n%@[END]\n"
@">> for:\n%@\n>> diff:\n%@\n"
@">> lengthReceived: %lu lengthExpected: %lu", header, resultString,
expected, headerData, diff, [resultString length], [expected length]];
testWithMessage(testResult, testErrorMsg);
}
+28 -2
View File
@@ -1,8 +1,10 @@
/* TestNSString+Utilities.m - this file is part of SOGo
*
* Copyright (C) 2011 Inverse inc
* Copyright (C) 2014 Zentyal
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
* Jesús García Sáez <jgarcia@zentyal.com>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,7 +25,7 @@
/* This file is encoded in utf-8. */
#import <SOGo/NSString+Utilities.h>
#import <Foundation/NSNull.h>
#import "SOGoTest.h"
@interface TestNSString_plus_Utilities : SOGoTest
@@ -52,7 +54,7 @@
NSString *secret = @"this is a secret";
NSString *password = @"qwerty";
NSString *encresult, *decresult;
encresult = [secret encryptWithKey: nil];
failIf(encresult != nil);
encresult = [secret encryptWithKey: @""];
@@ -70,4 +72,28 @@
failIf(![decresult isEqualToString: secret]);
}
- (void) test_objectFromJSONString_single_values
{
NSString *json, *error;
NSInteger expected = 1;
id result;
// Decode null
json = [NSString stringWithFormat:@"null"];
result = [json objectFromJSONString];
testWithMessage(result == [NSNull null], @"Result should be null");
// Decode number
json = [NSString stringWithFormat:@"1"];
result = [json objectFromJSONString];
error = [NSString stringWithFormat: @"result %@ != expected %d",
result, expected];
testWithMessage((long)result != (long)expected, error);
// Decode string
json = [NSString stringWithFormat:@"\"kill me\""];
result = [json objectFromJSONString];
testEquals(result, @"kill me");
}
@end
+308
View File
@@ -0,0 +1,308 @@
/* TestRTFHandler.m
*
* Copyright (C) 2014 Zentyal
*
* Author: Jesús García Sáez <jgarcia@zentyal.org>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/* This file is encoded in utf-8. */
#import "RTFHandler.h"
#import "SOGoTest.h"
#import <Foundation/NSFileManager.h>
#import <Foundation/NSException.h>
#include <string.h>
@interface TestRTFHandler : SOGoTest
@end
@implementation TestRTFHandler
- (NSString *) rtf2html: (NSData *) rtf
{
NSString *html;
if (!rtf)
return nil;
RTFHandler *handler = [[RTFHandler alloc] initWithData: rtf];
NSMutableData *data2 = [handler parse];
if (data2 == nil)
{
NSString *error = [NSString stringWithFormat: @"Couldn't parse RTF data:\n %s",
(char *)[rtf bytes]];
testWithMessage(NO, error);
}
html = [[NSString alloc] initWithData: data2 encoding: NSUTF8StringEncoding];
if (html == nil)
{
html = [[NSString alloc] initWithData: data2 encoding: NSASCIIStringEncoding];
}
if (html == nil)
{
html = [[NSString alloc] initWithData: data2 encoding: NSISOLatin1StringEncoding];
}
if (html == nil)
{
NSString *error = [NSString stringWithFormat: @"Couldn't convert parsed data"];
testWithMessage(NO, error);
}
return html;
}
- (NSData *) dataWithContentsOfFixture: (NSString*) name
{
NSString *file_path = [NSString stringWithFormat: @"Fixtures/%@", name];
if(![[NSFileManager defaultManager] fileExistsAtPath: file_path]) {
NSString *error = [NSString stringWithFormat: @"File %@ doesn't exist", file_path];
testWithMessage(false, error);
}
return [NSData dataWithContentsOfFile: file_path];
}
- (NSData *) dataWithContentsOfZentyalCrash: (unsigned int) number
{
NSString *fixture = [NSString stringWithFormat: @"zentyal_crash_%u.rtf", number];
return [self dataWithContentsOfFixture: fixture];
}
- (void) checkDoesNotCrash: (unsigned int) number
{
// FIXME fork
[self rtf2html: [self dataWithContentsOfZentyalCrash: number]];
}
- (void) checkHTMLConversionOfRTFFile: (NSString*) file
againstExpectedHTML: (NSString*) expected
{
NSData *in = nil;
NSString *out = nil, *error = nil;
in = [self dataWithContentsOfFixture: file];
out = [self rtf2html: in];
error = [NSString stringWithFormat:
@"Html from rtf result is not what we expected.\n>> Actual:\n%@\n>> Expected:\n%@\n", out, expected];
testWithMessage([out isEqualToString: expected], error);
}
- (void) checkFonTableParsingOfRTFFile: (NSString*) file
againstExpectedTable: (NSString*) expected
{
NSData *in = nil;
char *in_bytes;
char *table_pointer;
int newCurrentPos;
RTFHandler *handler;
RTFFontTable *out_table;
NSString *out_description, *error = nil;
in = [self dataWithContentsOfFixture: file];
in_bytes = (char *) [in bytes];
table_pointer = strstr(in_bytes, "{\\fonttbl");
if (table_pointer == NULL)
{
[NSException raise: @"NSInvalidArgumentException"
format: @"No font table in RTF file"];
}
newCurrentPos = table_pointer - in_bytes;
handler = [[RTFHandler alloc] initWithData: in];
[handler mangleInternalStateWithBytesPtr: table_pointer
andCurrentPos: newCurrentPos];
out_table = [handler parseFontTable];
out_description = [out_table description];
if ([out_description isEqualToString: expected])
{
testWithMessage(YES, @"no error");
}
else
{
error = [NSString stringWithFormat:
@"Font table is not what we expected.\n>> Actual:\n%@-----\n>> Expected:\n%@-----\n", out_description, expected];
testWithMessage(NO, error);
}
}
- (void) test_zentyal_crash_2058
{
[self checkDoesNotCrash: 2058];
// Output is not correct... but the original issue was segfault
}
- (void) test_zentyal_crash_2089
{
NSData *in = nil;
NSString *out = nil, *error = nil, *expected = nil;
in = [self dataWithContentsOfZentyalCrash: 2089];
expected =@"<html><meta charset='utf-8'><body><font face=\"Calibri\"><font color=\"#000000\">Lorem Ipsum</font><font color=\"#000000\"><br></font></body></html>";
out = [self rtf2html: in];
error = [NSString stringWithFormat:
@"Html from rtf result `%@` is not what we expected", out];
testWithMessage([out isEqualToString: expected], error);
}
- (void) test_zentyal_crash_6330
{
[self checkDoesNotCrash: 6330];
}
- (void) test_zentyal_crash_8346
{
[self checkDoesNotCrash: 8346];
}
- (void) test_zentyal_crash_6977
{
[self checkDoesNotCrash: 6977];
}
- (void) test_zentyal_crash_7067
{
[self checkDoesNotCrash: 7067];
}
- (void) test_mini_russian_font_table
{
NSString *file =@"mini_russian.rtf";
NSMutableString *expected = [NSMutableString stringWithFormat: @"Number of fonts: 84\n"];
[expected appendString: @"0 name=Times New Roman family=roman charset=0 pitch=2\n"];
[expected appendString: @"31500 name=Times New Roman family=roman charset=0 pitch=2\n"];
[expected appendString: @"31501 name=Times New Roman family=roman charset=0 pitch=2\n"];
[expected appendString: @"31502 name=Cambria family=roman charset=0 pitch=2\n"];
[expected appendString: @"37 name=Calibri family=swiss charset=0 pitch=2\n"];
[expected appendString: @"31503 name=Times New Roman family=roman charset=0 pitch=2\n"];
[expected appendString: @"39 name=Times New Roman CE family=roman charset=238 pitch=2\n"];
[expected appendString: @"31504 name=Times New Roman family=roman charset=0 pitch=2\n"];
[expected appendString: @"40 name=Times New Roman Cyr family=roman charset=204 pitch=2\n"];
[expected appendString: @"31505 name=Times New Roman family=roman charset=0 pitch=2\n"];
[expected appendString: @"31506 name=Calibri family=swiss charset=0 pitch=2\n"];
[expected appendString: @"42 name=Times New Roman Greek family=roman charset=161 pitch=2\n"];
[expected appendString: @"31507 name=Times New Roman family=roman charset=0 pitch=2\n"];
[expected appendString: @"31508 name=Times New Roman CE family=roman charset=238 pitch=2\n"];
[expected appendString: @"43 name=Times New Roman Tur family=roman charset=162 pitch=2\n"];
[expected appendString: @"31509 name=Times New Roman Cyr family=roman charset=204 pitch=2\n"];
[expected appendString: @"44 name=Times New Roman (Hebrew) family=roman charset=177 pitch=2\n"];
[expected appendString: @"45 name=Times New Roman (Arabic) family=roman charset=178 pitch=2\n"];
[expected appendString: @"31511 name=Times New Roman Greek family=roman charset=161 pitch=2\n"];
[expected appendString: @"46 name=Times New Roman Baltic family=roman charset=186 pitch=2\n"];
[expected appendString: @"31512 name=Times New Roman Tur family=roman charset=162 pitch=2\n"];
[expected appendString: @"47 name=Times New Roman (Vietnamese) family=roman charset=163 pitch=2\n"];
[expected appendString: @"31513 name=Times New Roman (Hebrew) family=roman charset=177 pitch=2\n"];
[expected appendString: @"31514 name=Times New Roman (Arabic) family=roman charset=178 pitch=2\n"];
[expected appendString: @"31515 name=Times New Roman Baltic family=roman charset=186 pitch=2\n"];
[expected appendString: @"31516 name=Times New Roman (Vietnamese) family=roman charset=163 pitch=2\n"];
[expected appendString: @"31518 name=Times New Roman CE family=roman charset=238 pitch=2\n"];
[expected appendString: @"31519 name=Times New Roman Cyr family=roman charset=204 pitch=2\n"];
[expected appendString: @"31521 name=Times New Roman Greek family=roman charset=161 pitch=2\n"];
[expected appendString: @"31522 name=Times New Roman Tur family=roman charset=162 pitch=2\n"];
[expected appendString: @"31523 name=Times New Roman (Hebrew) family=roman charset=177 pitch=2\n"];
[expected appendString: @"31524 name=Times New Roman (Arabic) family=roman charset=178 pitch=2\n"];
[expected appendString: @"31525 name=Times New Roman Baltic family=roman charset=186 pitch=2\n"];
[expected appendString: @"31526 name=Times New Roman (Vietnamese) family=roman charset=163 pitch=2\n"];
[expected appendString: @"31528 name=Cambria CE family=roman charset=238 pitch=2\n"];
[expected appendString: @"31529 name=Cambria Cyr family=roman charset=204 pitch=2\n"];
[expected appendString: @"31531 name=Cambria Greek family=roman charset=161 pitch=2\n"];
[expected appendString: @"31532 name=Cambria Tur family=roman charset=162 pitch=2\n"];
[expected appendString: @"31535 name=Cambria Baltic family=roman charset=186 pitch=2\n"];
[expected appendString: @"31536 name=Cambria (Vietnamese) family=roman charset=163 pitch=2\n"];
[expected appendString: @"31538 name=Times New Roman CE family=roman charset=238 pitch=2\n"];
[expected appendString: @"31539 name=Times New Roman Cyr family=roman charset=204 pitch=2\n"];
[expected appendString: @"31541 name=Times New Roman Greek family=roman charset=161 pitch=2\n"];
[expected appendString: @"31542 name=Times New Roman Tur family=roman charset=162 pitch=2\n"];
[expected appendString: @"31543 name=Times New Roman (Hebrew) family=roman charset=177 pitch=2\n"];
[expected appendString: @"31544 name=Times New Roman (Arabic) family=roman charset=178 pitch=2\n"];
[expected appendString: @"31545 name=Times New Roman Baltic family=roman charset=186 pitch=2\n"];
[expected appendString: @"31546 name=Times New Roman (Vietnamese) family=roman charset=163 pitch=2\n"];
[expected appendString: @"31548 name=Times New Roman CE family=roman charset=238 pitch=2\n"];
[expected appendString: @"31549 name=Times New Roman Cyr family=roman charset=204 pitch=2\n"];
[expected appendString: @"31551 name=Times New Roman Greek family=roman charset=161 pitch=2\n"];
[expected appendString: @"31552 name=Times New Roman Tur family=roman charset=162 pitch=2\n"];
[expected appendString: @"31553 name=Times New Roman (Hebrew) family=roman charset=177 pitch=2\n"];
[expected appendString: @"31554 name=Times New Roman (Arabic) family=roman charset=178 pitch=2\n"];
[expected appendString: @"31555 name=Times New Roman Baltic family=roman charset=186 pitch=2\n"];
[expected appendString: @"31556 name=Times New Roman (Vietnamese) family=roman charset=163 pitch=2\n"];
[expected appendString: @"31558 name=Times New Roman CE family=roman charset=238 pitch=2\n"];
[expected appendString: @"31559 name=Times New Roman Cyr family=roman charset=204 pitch=2\n"];
[expected appendString: @"31561 name=Times New Roman Greek family=roman charset=161 pitch=2\n"];
[expected appendString: @"31562 name=Times New Roman Tur family=roman charset=162 pitch=2\n"];
[expected appendString: @"31563 name=Times New Roman (Hebrew) family=roman charset=177 pitch=2\n"];
[expected appendString: @"31564 name=Times New Roman (Arabic) family=roman charset=178 pitch=2\n"];
[expected appendString: @"31565 name=Times New Roman Baltic family=roman charset=186 pitch=2\n"];
[expected appendString: @"31566 name=Times New Roman (Vietnamese) family=roman charset=163 pitch=2\n"];
[expected appendString: @"31568 name=Calibri CE family=swiss charset=238 pitch=2\n"];
[expected appendString: @"31569 name=Calibri Cyr family=swiss charset=204 pitch=2\n"];
[expected appendString: @"31571 name=Calibri Greek family=swiss charset=161 pitch=2\n"];
[expected appendString: @"31572 name=Calibri Tur family=swiss charset=162 pitch=2\n"];
[expected appendString: @"31575 name=Calibri Baltic family=swiss charset=186 pitch=2\n"];
[expected appendString: @"31576 name=Calibri (Vietnamese) family=swiss charset=163 pitch=2\n"];
[expected appendString: @"31578 name=Times New Roman CE family=roman charset=238 pitch=2\n"];
[expected appendString: @"31579 name=Times New Roman Cyr family=roman charset=204 pitch=2\n"];
[expected appendString: @"31581 name=Times New Roman Greek family=roman charset=161 pitch=2\n"];
[expected appendString: @"31582 name=Times New Roman Tur family=roman charset=162 pitch=2\n"];
[expected appendString: @"31583 name=Times New Roman (Hebrew) family=roman charset=177 pitch=2\n"];
[expected appendString: @"31584 name=Times New Roman (Arabic) family=roman charset=178 pitch=2\n"];
[expected appendString: @"409 name=Calibri CE family=swiss charset=238 pitch=2\n"];
[expected appendString: @"31585 name=Times New Roman Baltic family=roman charset=186 pitch=2\n"];
[expected appendString: @"410 name=Calibri Cyr family=swiss charset=204 pitch=2\n"];
[expected appendString: @"31586 name=Times New Roman (Vietnamese) family=roman charset=163 pitch=2\n"];
[expected appendString: @"412 name=Calibri Greek family=swiss charset=161 pitch=2\n"];
[expected appendString: @"413 name=Calibri Tur family=swiss charset=162 pitch=2\n"];
[expected appendString: @"416 name=Calibri Baltic family=swiss charset=186 pitch=2\n"];
[expected appendString: @"417 name=Calibri (Vietnamese) family=swiss charset=163 pitch=2\n"];
[self checkFonTableParsingOfRTFFile: file
againstExpectedTable: expected];
}
- (void) test_mini_russian
{
NSString *file =@"mini_russian.rtf";
NSString *expected=@"<html><meta charset='utf-8'><body><font face=\"Calibri\"><font face=\"Calibri Cyr\"><font color=\"#000000\">XXзык польски, польщизнаXX</font></font></font></body></html>";
[self checkHTMLConversionOfRTFFile: file
againstExpectedHTML: expected];
}
- (void) test_escapes
{
NSString *file =@"escapes.rtf";
NSString *expected=@"<html><meta charset='utf-8'><body><font face=\"Calibri\"><font color=\"#000000\">x341x351x372x355x363x361x</font><font color=\"#000000\">S SS-S\\S</font><font color=\"#000000\">U老UřU</font><font color=\"#000000\"><br></font></font></body></html>";
[self checkHTMLConversionOfRTFFile: file
againstExpectedHTML: expected];
}
- (void) test_spanish_accents
{
NSString *file =@"spanish_accents.rtf";
NSString *expected=@"<html><meta charset='utf-8'><body><font face=\"Calibri\"><font color=\"#000000\">xñxáxéxíxóxú</font><font color=\"#000000\"><br></font></font></body></html>";
[self checkHTMLConversionOfRTFFile: file
againstExpectedHTML: expected];
}
@end
+12 -6
View File
@@ -21,6 +21,7 @@
*/
#import <Foundation/NSException.h>
#import <Foundation/NSLocale.h>
#import <Foundation/NSString.h>
#import <Foundation/NSValue.h>
@@ -71,6 +72,8 @@
{
SBJsonParser *parser;
id result;
NSDecimalNumber *obtained, *expected;
NSDictionary *locale;
parser = [SBJsonParser new];
[parser autorelease];
@@ -80,17 +83,20 @@
result = [parser objectWithString: @"[ 0 ]"];
testEquals (result, [NSArray arrayWithObject: [NSNumber numberWithInt: 0]]);
result = [parser objectWithString: @"[ -1 ]"];
testEquals (result, [NSArray arrayWithObject: [NSNumber numberWithInt: -1]]);
locale = [NSDictionary dictionaryWithObject: @"." forKey: NSLocaleDecimalSeparator];
result = [parser objectWithString: @"[ 12.3456 ]"];
testEquals ([result objectAtIndex: 0],
[NSDecimalNumber decimalNumberWithString: @"12.3456"]);
obtained = [result objectAtIndex: 0];
expected = [NSDecimalNumber decimalNumberWithString: @"12.3456" locale: locale];
test ([obtained compare: expected] == NSOrderedSame);
result = [parser objectWithString: @"[ -312.3456 ]"];
testEquals (result, [NSArray arrayWithObject: [NSNumber numberWithDouble: -312.3456]]);
obtained = [result objectAtIndex: 0];
expected = [NSDecimalNumber decimalNumberWithString: @"-312.3456" locale: locale];
test ([obtained compare: expected] == NSOrderedSame);
}
@end
+2 -1
View File
@@ -44,6 +44,7 @@
/* TODO: this test fails for obscure reasons, but test__occurrenceForDate_byRRule_ does not, which
is a good sign */
/*
- (void) test_occurrenceForDate_
{
NSString *periods[] = { (@"BEGIN:DAYLIGHT\r\n"
@@ -84,7 +85,7 @@
@" delta = %ld", count, delta]));
}
}
*/
- (void) test__occurrenceForDate_byRRule_
{
/* all rules are happening on 2010-03-14 */