diff --git a/HTMLKit.xcodeproj/project.pbxproj b/HTMLKit.xcodeproj/project.pbxproj
index 79389ad..f01429d 100644
--- a/HTMLKit.xcodeproj/project.pbxproj
+++ b/HTMLKit.xcodeproj/project.pbxproj
@@ -78,6 +78,8 @@
624AC90F19FC702E00BD3C4A /* HTML Standard.html in Resources */ = {isa = PBXBuildFile; fileRef = 624AC90D19FC702E00BD3C4A /* HTML Standard.html */; };
624B9FB21AE0313300646C4C /* HTMLKitStringCategoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B9FB11AE0313300646C4C /* HTMLKitStringCategoryTests.m */; };
624B9FB31AE0313300646C4C /* HTMLKitStringCategoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B9FB11AE0313300646C4C /* HTMLKitStringCategoryTests.m */; };
+ 624B9FB51AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B9FB41AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m */; };
+ 624B9FB61AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B9FB41AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m */; };
625A14B019C7829400AD0C32 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14AF19C7829400AD0C32 /* Cocoa.framework */; };
625A14BA19C7829400AD0C32 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 625A14B819C7829400AD0C32 /* InfoPlist.strings */; };
625A14BE19C7829400AD0C32 /* HTMLKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A14BD19C7829400AD0C32 /* HTMLKit.m */; };
@@ -203,6 +205,7 @@
624AC90419FBFE8A00BD3C4A /* html5lib-tests */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "html5lib-tests"; sourceTree = ""; };
624AC90D19FC702E00BD3C4A /* HTML Standard.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "HTML Standard.html"; sourceTree = ""; };
624B9FB11AE0313300646C4C /* HTMLKitStringCategoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitStringCategoryTests.m; sourceTree = ""; };
+ 624B9FB41AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitOrderedDictionaryTests.m; sourceTree = ""; };
625A14AC19C7829400AD0C32 /* HTMLKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HTMLKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
625A14AF19C7829400AD0C32 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
625A14B219C7829400AD0C32 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
@@ -408,6 +411,7 @@
isa = PBXGroup;
children = (
623916C61AC7209E0066B4FE /* HTMLKitNodeTreeEnumratorTests.m */,
+ 624B9FB41AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m */,
624B9FB11AE0313300646C4C /* HTMLKitStringCategoryTests.m */,
6236738C1AC0CD2400FF89B3 /* Tokenizer */,
623975581AC362A5007E26F1 /* Tree Construction */,
@@ -715,6 +719,7 @@
files = (
6239755B1AC362CA007E26F1 /* HTMLKitTreeConstructionTests.m in Sources */,
623CAF9E1AD88BEA00E34C32 /* HTMLKitParserPerformance.m in Sources */,
+ 624B9FB61AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m in Sources */,
6236738F1AC0CE2500FF89B3 /* HTMLKitTokenizerPerformance.m in Sources */,
624AC90219FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m in Sources */,
624B9FB31AE0313300646C4C /* HTMLKitStringCategoryTests.m in Sources */,
@@ -764,6 +769,7 @@
files = (
6239755A1AC362CA007E26F1 /* HTMLKitTreeConstructionTests.m in Sources */,
623CAF9D1AD88BEA00E34C32 /* HTMLKitParserPerformance.m in Sources */,
+ 624B9FB51AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m in Sources */,
6236738E1AC0CE2500FF89B3 /* HTMLKitTokenizerPerformance.m in Sources */,
624AC90119FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m in Sources */,
624B9FB21AE0313300646C4C /* HTMLKitStringCategoryTests.m in Sources */,
diff --git a/HTMLKit/HTMLOrderedDictionary.h b/HTMLKit/HTMLOrderedDictionary.h
index d936243..aad6baf 100644
--- a/HTMLKit/HTMLOrderedDictionary.h
+++ b/HTMLKit/HTMLOrderedDictionary.h
@@ -18,7 +18,7 @@
- (NSUInteger)indexOfKey:(id)aKey;
- (id)objectAtIndexedSubscript:(NSUInteger)index;
-- (void)setObject:(id)obj forIndexedSubscript:(NSUInteger)index;
+- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index;
- (NSEnumerator *)reverseKeyEnumerator;
diff --git a/HTMLKit/HTMLOrderedDictionary.m b/HTMLKit/HTMLOrderedDictionary.m
index 2712689..8cc03e5 100644
--- a/HTMLKit/HTMLOrderedDictionary.m
+++ b/HTMLKit/HTMLOrderedDictionary.m
@@ -78,26 +78,20 @@
- (id)objectAtIndex:(NSUInteger)index
{
- if (index >= _keys.count) {
- return nil;
- }
return _dictionary[_keys[index]];
}
- (void)setObject:(id)anObject forKey:(id)aKey atIndex:(NSUInteger)index
{
- if (index >= _keys.count) {
- return;
+ if (_dictionary[aKey]) {
+ [_keys removeObject:aKey];
}
- [_keys replaceObjectAtIndex:index withObject:aKey];
+ [_keys insertObject:aKey atIndex:index];
_dictionary[aKey] = anObject;
}
- (void)removeObjectAtIndex:(NSUInteger)index
{
- if (index >= _keys.count) {
- return;
- }
if (_dictionary[_keys[index]]){
[_dictionary removeObjectForKey:_keys[index]];
[_keys removeObjectAtIndex:index];
@@ -106,10 +100,6 @@
- (void)replaceKeyValueAtIndex:(NSUInteger)index withObject:(id)anObject andKey:(id)aKey
{
- if (index >= _keys.count) {
- return;
- }
- [_dictionary removeObjectForKey:_keys[index]];
[_keys replaceObjectAtIndex:index withObject:aKey];
_dictionary[aKey] = anObject;
}
@@ -134,17 +124,12 @@
- (id)objectAtIndexedSubscript:(NSUInteger)index
{
- if (index >= _keys.count) {
- return nil;
- }
return _dictionary[_keys[index]];
}
-- (void)setObject:(id)obj forIndexedSubscript:(NSUInteger)index
+- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index
{
- if (index < _keys.count) {
- _dictionary[_keys[index]] = obj;
- }
+ _dictionary[_keys[index]] = obj;
}
- (void)setObject:(id)obj forKeyedSubscript:(id)key
diff --git a/HTMLKitTests/HTMLKitOrderedDictionaryTests.m b/HTMLKitTests/HTMLKitOrderedDictionaryTests.m
new file mode 100644
index 0000000..c9bf8c1
--- /dev/null
+++ b/HTMLKitTests/HTMLKitOrderedDictionaryTests.m
@@ -0,0 +1,184 @@
+//
+// HTMLKitOrderedDictionaryTests.m
+// HTMLKit
+//
+// Created by Iska on 16/04/15.
+// Copyright (c) 2015 BrainCookie. All rights reserved.
+//
+
+#import
+#import "HTMLOrderedDictionary.h"
+
+@interface HTMLKitOrderedDictionaryTests : XCTestCase
+{
+ HTMLOrderedDictionary *_dictionary;
+}
+@end
+
+@implementation HTMLKitOrderedDictionaryTests
+
+- (void)setUp
+{
+ [super setUp];
+ _dictionary = [HTMLOrderedDictionary new];
+}
+
+- (void)testSetObjectForKey
+{
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, @[]);
+
+ [_dictionary setObject:@"1" forKey:@"A"];
+ NSArray *expected = @[@"A"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+
+ [_dictionary setObject:@"2" forKey:@"B"];
+ expected = @[@"A", @"B"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+
+ [_dictionary setObject:@"3" forKey:@"C"];
+ expected = @[@"A", @"B", @"C"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+
+ XCTAssertThrows([_dictionary setObject:nil forKey:@"Key"]);
+ XCTAssertThrows([_dictionary setObject:@"Object" forKey:nil]);
+}
+
+- (void)testIndexOfKey
+{
+ [_dictionary setObject:@"1" forKey:@"A"];
+ [_dictionary setObject:@"2" forKey:@"B"];
+ [_dictionary setObject:@"3" forKey:@"C"];
+ XCTAssertEqual([_dictionary indexOfKey:@"A"], 0);
+ XCTAssertEqual([_dictionary indexOfKey:@"B"], 1);
+ XCTAssertEqual([_dictionary indexOfKey:@"C"], 2);
+ XCTAssertEqual([_dictionary indexOfKey:nil], NSNotFound);
+}
+
+- (void)testObjectAtIndex
+{
+ [_dictionary setObject:@"1" forKey:@"A"];
+ [_dictionary setObject:@"2" forKey:@"B"];
+ XCTAssertEqualObjects([_dictionary objectAtIndex:0], @"1");
+ XCTAssertEqualObjects([_dictionary objectAtIndex:1], @"2");
+
+ [_dictionary setObject:@"3" forKey:@"C" atIndex:1];
+ XCTAssertEqualObjects([_dictionary objectAtIndex:1], @"3");
+
+ XCTAssertThrows([_dictionary setObject:nil forKey:@"Key" atIndex:0]);
+ XCTAssertThrows([_dictionary setObject:@"Object" forKey:nil atIndex:0]);
+ XCTAssertThrows([_dictionary setObject:@"Object" forKey:@"Key" atIndex:100]);
+}
+
+- (void)testIndexedSubscript
+{
+ [_dictionary setObject:@"1" forKey:@"A"];
+ [_dictionary setObject:@"2" forKey:@"B"];
+ [_dictionary setObject:@"3" forKey:@"C"];
+ XCTAssertEqualObjects(_dictionary[0], @"1");
+ XCTAssertEqualObjects(_dictionary[1], @"2");
+ XCTAssertEqualObjects(_dictionary[2], @"3");
+
+ _dictionary[1] = @"4";
+ _dictionary[2] = @"5";
+ XCTAssertEqualObjects(_dictionary[1], @"4");
+ XCTAssertEqualObjects(_dictionary[2], @"5");
+
+ XCTAssertThrows(_dictionary[100]);
+}
+
+- (void)testKeyedSubscript
+{
+ _dictionary[@"A"] = @"1";
+ _dictionary[@"B"] = @"2";
+ _dictionary[@"C"] = @"3";
+ NSArray *expected = @[@"A", @"B", @"C"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+
+ XCTAssertEqualObjects(_dictionary[@"Key"], nil);
+}
+
+- (void)testSetObjectForKeyAtIndex
+{
+ _dictionary[@"A"] = @"1";
+ _dictionary[@"B"] = @"2";
+ NSArray *expected = @[@"A", @"B"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+
+ [_dictionary setObject:@"3" forKey:@"C" atIndex:0];
+ expected = @[@"C", @"A", @"B"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+
+ [_dictionary setObject:@"4" forKey:@"C" atIndex:0];
+ expected = @[@"C", @"A", @"B"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+ XCTAssertEqualObjects(_dictionary[0], @"4");
+ XCTAssertEqualObjects(_dictionary[@"C"], @"4");
+
+ [_dictionary setObject:@"5" forKey:@"A" atIndex:2];
+ expected = @[@"C", @"B", @"A"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+ XCTAssertEqualObjects(_dictionary[2], @"5");
+ XCTAssertEqualObjects(_dictionary[@"A"], @"5");
+
+ XCTAssertThrows([_dictionary setObject:nil forKey:@"Key" atIndex:0]);
+ XCTAssertThrows([_dictionary setObject:@"Object" forKey:nil atIndex:0]);
+ XCTAssertThrows([_dictionary setObject:@"Object" forKey:@"Key" atIndex:100]);
+}
+
+- (void)testRemoveObjectAtIndex
+{
+ _dictionary[@"A"] = @"1";
+ _dictionary[@"B"] = @"2";
+ _dictionary[@"C"] = @"3";
+ [_dictionary removeObjectAtIndex:1];
+ NSArray *expected = @[@"A", @"C"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+
+ [_dictionary removeObjectAtIndex:1];
+ expected = @[@"A"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+
+ XCTAssertThrows([_dictionary removeObjectAtIndex:100]);
+}
+
+- (void)testReplaceKeyValuePairAtIndex
+{
+ _dictionary[@"A"] = @"1";
+ _dictionary[@"B"] = @"2";
+ _dictionary[@"C"] = @"3";
+ [_dictionary replaceKeyValueAtIndex:1 withObject:@"4" andKey:@"D"];
+ NSArray *expected = @[@"A", @"D", @"C"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+ XCTAssertEqualObjects(_dictionary[1], @"4");
+ XCTAssertEqualObjects(_dictionary[@"D"], @"4");
+
+ [_dictionary replaceKeyValueAtIndex:0 withObject:@"5" andKey:@"E"];
+ expected = @[@"E", @"D", @"C"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+ XCTAssertEqualObjects(_dictionary[0], @"5");
+ XCTAssertEqualObjects(_dictionary[@"E"], @"5");
+
+ XCTAssertThrows([_dictionary replaceKeyValueAtIndex:1 withObject:nil andKey:@"Key"]);
+ XCTAssertThrows([_dictionary replaceKeyValueAtIndex:1 withObject:@"Object" andKey:nil]);
+ XCTAssertThrows([_dictionary replaceKeyValueAtIndex:100 withObject:@"Object" andKey:@"Key"]);
+}
+
+- (void)testReplaceKeyAtIndex
+{
+ _dictionary[@"A"] = @"1";
+ _dictionary[@"B"] = @"2";
+ _dictionary[@"C"] = @"3";
+ [_dictionary replaceKey:@"A" withKey:@"D"];
+ NSArray *expected = @[@"D", @"B", @"C"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+
+ [_dictionary replaceKey:@"B" withKey:@"E"];
+ expected = @[@"D", @"E", @"C"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+
+ [_dictionary replaceKey:@"Key" withKey:@"F"];
+ expected = @[@"D", @"E", @"C"];
+ XCTAssertEqualObjects(_dictionary.keyEnumerator.allObjects, expected);
+}
+
+@end