forked from alexaubry/HTMLString
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHTMLStringObjcTests.m
More file actions
157 lines (114 loc) · 7.14 KB
/
HTMLStringObjcTests.m
File metadata and controls
157 lines (114 loc) · 7.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
@import XCTest;
@import HTMLString;
@interface HTMLStringObjcTests : XCTestCase
@end
@implementation HTMLStringObjcTests
#pragma mark - Escaping
/// Tests escaping a string for ASCII.
- (void)testStringASCIIEscaping {
NSString * emptyString = [@"" stringByAddingASCIIEntities];
XCTAssertTrue([emptyString isEqualToString: @""]);
NSString* namedEscape = [@"Fish & Chips" stringByAddingASCIIEntities];
XCTAssertTrue([namedEscape isEqualToString: @"Fish & Chips"]);
NSString* namedDualEscape = [@"a ⪰̸ b" stringByAddingASCIIEntities];
XCTAssertTrue([namedDualEscape isEqualToString: @"a ⪰̸ b"]);
NSString* emojiEscape = [@"Hey 🙃" stringByAddingASCIIEntities];
XCTAssertTrue([emojiEscape isEqualToString: @"Hey 🙃"]);
NSString* doubleEmojiEscape = [@"Going to the 🇺🇸 next June" stringByAddingASCIIEntities];
XCTAssertTrue([doubleEmojiEscape isEqualToString: @"Going to the 🇺🇸 next June"]);
}
/// Tests escaping a string for Unicode.
- (void) testStringUnicodeEscaping {
NSString* requiredEscape = [@"Fish & Chips" stringByAddingUnicodeEntities];
XCTAssertTrue([requiredEscape isEqualToString: @"Fish & Chips"]);
NSString* namedDualEscape = [@"a ⪰̸ b" stringByAddingUnicodeEntities];
XCTAssertTrue([namedDualEscape isEqualToString: @"a ⪰̸ b"]);
NSString* emojiEscape = [@"Hey 🙃!" stringByAddingUnicodeEntities];
XCTAssertTrue([emojiEscape isEqualToString: @"Hey 🙃!"]);
NSString* doubleEmojiEscape = [@"Going to the 🇺🇸 next June" stringByAddingUnicodeEntities];
XCTAssertTrue([doubleEmojiEscape isEqualToString: @"Going to the 🇺🇸 next June"]);
}
#pragma mark - Unescaping
/// Tests unescaping strings.
-(void) testUnescaping {
NSString* withoutMarker = [@"Hello, world." stringByRemovingHTMLEntities];
XCTAssertTrue([withoutMarker isEqualToString: @"Hello, world."]);
NSString* noSemicolon = [@"Fish & Chips" stringByRemovingHTMLEntities];
XCTAssertTrue([noSemicolon isEqualToString: @"Fish & Chips"]);
NSString* decimal = [@"My phone number starts with a 1" stringByRemovingHTMLEntities];
XCTAssertTrue([decimal isEqualToString: @"My phone number starts with a 1"]);
NSString* invalidDecimal = [@"My phone number starts with a _9;!" stringByRemovingHTMLEntities];
XCTAssertTrue(invalidDecimal, "My phone number starts with a _9;!");
NSString* hex = [@"Let's meet at the café" stringByRemovingHTMLEntities];
XCTAssertTrue([hex isEqualToString: @"Let's meet at the café"]);
NSString* invalidHex = [@"Let's meet at the caf&#xzi;!" stringByRemovingHTMLEntities];
XCTAssertTrue([invalidHex isEqualToString: @"Let's meet at the caf&#xzi;!"]);
NSString* invalidUnicodePoint = [@"What is this character ? -> �" stringByRemovingHTMLEntities];
XCTAssertTrue([invalidUnicodePoint isEqualToString: @"What is this character ? -> �"]);
NSString* badSequence = [@"I love &swift;" stringByRemovingHTMLEntities];
XCTAssertTrue([badSequence isEqualToString: @"I love &swift;"]);
NSString* goodSequence = [@"Do you know ℵ?" stringByRemovingHTMLEntities];
XCTAssertTrue([goodSequence isEqualToString: @"Do you know ℵ?"]);
NSString* twoSequences = [@"a && b" stringByRemovingHTMLEntities];
XCTAssertTrue([twoSequences isEqualToString: @"a && b"]);
NSString* doubleEmojiEscape = [@"Going to the 🇺🇸 next June" stringByRemovingHTMLEntities];
XCTAssertTrue([doubleEmojiEscape isEqualToString: @"Going to the 🇺🇸 next June"]);
NSString* textInTheMiddle = [@"Fish & Chips tastes "great\"" stringByRemovingHTMLEntities];
XCTAssertTrue([textInTheMiddle isEqualToString: @"Fish & Chips tastes \"great\""]);
}
#pragma mark - Open Data
-(void) testThatItUnescapesSampleData {
NSString* review = @"44 Fotos und 68 Tipps von 567 Besucher bei NETA Mexican Street Food anzeigen. "Not sharing the enthusiasm of the other reviewers. The tacos were..."";
NSString* expectedReview = @"44 Fotos und 68 Tipps von 567 Besucher bei NETA Mexican Street Food anzeigen. \"Not sharing the enthusiasm of the other reviewers. The tacos were...\"";
XCTAssertTrue([[review stringByRemovingHTMLEntities] isEqualToString: expectedReview]);
NSString* foursquare = @"NETA Mexican Street Food, Weinbergsweg 5, Berlin, Berlin, neta mexican street food, Burritos, Mexikanisch, Nachspeise, Abendessen & more";
NSString* expectedFoursquare = @"NETA Mexican Street Food, Weinbergsweg 5, Berlin, Berlin, neta mexican street food, Burritos, Mexikanisch, Nachspeise, Abendessen & more";
XCTAssertTrue([[foursquare stringByRemovingHTMLEntities] isEqualToString: expectedFoursquare]);
NSString* headline = @"What's it like to drive with Tesla's Autopilot and how does it work?";
NSString* expectedHeadline = @"What's it like to drive with Tesla's Autopilot and how does it work?";
XCTAssertTrue([[headline stringByRemovingHTMLEntities] isEqualToString: expectedHeadline]);
}
#pragma mark - Benchmark
/// Measures the average unescaping performance.
-(void) testUnescapingPerformance {
// baseline average: 0.001s
[self measureBlock:^{
(void)[@"Hello, world." stringByRemovingHTMLEntities];
(void)[@"Fish & Chips" stringByRemovingHTMLEntities];
(void)[@"My phone number starts with a 1" stringByRemovingHTMLEntities];
(void)[@"My phone number starts with a _9;!" stringByRemovingHTMLEntities];
(void)[@"Let's meet at the café" stringByRemovingHTMLEntities];
(void)[@"Let's meet at the caf&#xzi;!"stringByRemovingHTMLEntities];
(void)[@"What is this character ? -> �" stringByRemovingHTMLEntities];
(void)[@"I love &swift;" stringByRemovingHTMLEntities];
(void)[@"Do you know ℵ?" stringByRemovingHTMLEntities];
(void)[@"a && b" stringByRemovingHTMLEntities];
}];
}
/// Measures escaping avergae performance.
-(void) testEscapingPerformance {
// baseline average: 0.001s
[self measureBlock: ^{
(void)[@"Fish & Chips" stringByAddingASCIIEntities];
(void)[@"a ⪰̸ b" stringByAddingASCIIEntities];
(void)[@"Hey 🙃" stringByAddingASCIIEntities];
(void)[@"Going to the 🇺🇸 next June" stringByAddingASCIIEntities];
(void)[@"Fish & Chips" stringByAddingUnicodeEntities];
(void)[@"a ⪰̸ b" stringByAddingUnicodeEntities];
(void)[@"Hey 🙃!" stringByAddingUnicodeEntities];
(void)[@"Going to the 🇺🇸 next June" stringByAddingUnicodeEntities];
}];
}
/// Measures the average perforance of unescaping a long String with a large number of entities.
-(void) testLargeUnescapingPerformanceString {
NSURL *largeTextURL = [[NSBundle bundleForClass:HTMLStringObjcTests.class] URLForResource:@"large-text" withExtension:@"txt"];
if (!largeTextURL) {
return XCTFail("Cannot load test fixture.");
}
NSString *textString = [NSString stringWithContentsOfURL:largeTextURL encoding:NSUTF8StringEncoding error:nil];
// baseline average: 0.3s
[self measureBlock:^ {
(void)[textString stringByRemovingHTMLEntities];
}];
}
@end