From 7fb04f339426acd5edf09baef3b194bc3de78250 Mon Sep 17 00:00:00 2001 From: iska Date: Tue, 24 Mar 2015 00:15:49 +0100 Subject: [PATCH] Refactor Tokenizer tests into separate group and generate the test cases dynamically Instead of loading and running the HTML5Lib test files manually, the Xcode test cases are generated on start for all the HTML5Lib tokenizer tests. Also, the performance test is moved into its own class. This setup shouldn't require any extra maintenance when HTML5Lib adds new tokenizer test cases. --- HTMLKit.xcodeproj/project.pbxproj | 66 ++++---- ...5AB53A08-CDD0-43FB-B47F-2EE38B3FE707.plist | 13 ++ ...HTML5LibTest.h => HTML5LibTokenizerTest.h} | 9 +- ...HTML5LibTest.m => HTML5LibTokenizerTest.m} | 16 +- HTMLKitTests/HTMLKitTests.h | 16 -- HTMLKitTests/HTMLKitTests.m | 35 ---- HTMLKitTests/HTMLKitTokenizerPerformance.m | 37 +++++ HTMLKitTests/HTMLKitTokenizerTests.m | 145 +++++++++++++++++ HTMLKitTests/HTMLTokenizerTests.m | 153 ------------------ 9 files changed, 246 insertions(+), 244 deletions(-) rename HTMLKitTests/{HTML5LibTest.h => HTML5LibTokenizerTest.h} (62%) rename HTMLKitTests/{HTML5LibTest.m => HTML5LibTokenizerTest.m} (92%) delete mode 100644 HTMLKitTests/HTMLKitTests.h delete mode 100644 HTMLKitTests/HTMLKitTests.m create mode 100644 HTMLKitTests/HTMLKitTokenizerPerformance.m create mode 100644 HTMLKitTests/HTMLKitTokenizerTests.m delete mode 100644 HTMLKitTests/HTMLTokenizerTests.m diff --git a/HTMLKit.xcodeproj/project.pbxproj b/HTMLKit.xcodeproj/project.pbxproj index dbd4fed..0bc6af0 100644 --- a/HTMLKit.xcodeproj/project.pbxproj +++ b/HTMLKit.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ 6234BEEE1AABBF1400DEB15F /* HTMLStackOfOpenElements.h in Headers */ = {isa = PBXBuildFile; fileRef = 6234BEEC1AABBF1400DEB15F /* HTMLStackOfOpenElements.h */; }; 6234BEEF1AABBF1400DEB15F /* HTMLStackOfOpenElements.m in Sources */ = {isa = PBXBuildFile; fileRef = 6234BEED1AABBF1400DEB15F /* HTMLStackOfOpenElements.m */; }; 6234BEF01AABBF1400DEB15F /* HTMLStackOfOpenElements.m in Sources */ = {isa = PBXBuildFile; fileRef = 6234BEED1AABBF1400DEB15F /* HTMLStackOfOpenElements.m */; }; + 6234CF571ABF892400B6077D /* libHTMLKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14DE19C7834000AD0C32 /* libHTMLKit.a */; }; 6235CE9B1AA509430026937B /* NSString+HTMLKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 6235CE991AA509430026937B /* NSString+HTMLKit.h */; }; 6235CE9C1AA509430026937B /* NSString+HTMLKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 6235CE9A1AA509430026937B /* NSString+HTMLKit.m */; }; 6235CE9D1AA509430026937B /* NSString+HTMLKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 6235CE9A1AA509430026937B /* NSString+HTMLKit.m */; }; @@ -28,6 +29,8 @@ 62363C3D1ABE428200DAB4C6 /* HTMLListOfActiveFormattingElements.h in Headers */ = {isa = PBXBuildFile; fileRef = 62363C3B1ABE428200DAB4C6 /* HTMLListOfActiveFormattingElements.h */; }; 62363C3E1ABE428200DAB4C6 /* HTMLListOfActiveFormattingElements.m in Sources */ = {isa = PBXBuildFile; fileRef = 62363C3C1ABE428200DAB4C6 /* HTMLListOfActiveFormattingElements.m */; }; 62363C3F1ABE428200DAB4C6 /* HTMLListOfActiveFormattingElements.m in Sources */ = {isa = PBXBuildFile; fileRef = 62363C3C1ABE428200DAB4C6 /* HTMLListOfActiveFormattingElements.m */; }; + 6236738E1AC0CE2500FF89B3 /* HTMLKitTokenizerPerformance.m in Sources */ = {isa = PBXBuildFile; fileRef = 6236738D1AC0CE2500FF89B3 /* HTMLKitTokenizerPerformance.m */; }; + 6236738F1AC0CE2500FF89B3 /* HTMLKitTokenizerPerformance.m in Sources */ = {isa = PBXBuildFile; fileRef = 6236738D1AC0CE2500FF89B3 /* HTMLKitTokenizerPerformance.m */; }; 6238039F1AB63A8C008A53D0 /* HTMLEOFToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 6238039D1AB63A8C008A53D0 /* HTMLEOFToken.h */; }; 623803A01AB63A8C008A53D0 /* HTMLEOFToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 6238039E1AB63A8C008A53D0 /* HTMLEOFToken.m */; }; 623803A11AB63A8C008A53D0 /* HTMLEOFToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 6238039E1AB63A8C008A53D0 /* HTMLEOFToken.m */; }; @@ -50,8 +53,8 @@ 624493AD19CD0CBE00BCDDF4 /* HTMLToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 624493AB19CD0CBE00BCDDF4 /* HTMLToken.m */; }; 624493AE19CD0CBE00BCDDF4 /* HTMLToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 624493AB19CD0CBE00BCDDF4 /* HTMLToken.m */; }; 624AC8FF19FBF59800BD3C4A /* HTMLTokens.h in Headers */ = {isa = PBXBuildFile; fileRef = 624AC8FE19FBF4F700BD3C4A /* HTMLTokens.h */; }; - 624AC90119FBF9ED00BD3C4A /* HTMLTokenizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624AC90019FBF9ED00BD3C4A /* HTMLTokenizerTests.m */; }; - 624AC90219FBF9ED00BD3C4A /* HTMLTokenizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624AC90019FBF9ED00BD3C4A /* HTMLTokenizerTests.m */; }; + 624AC90119FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624AC90019FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m */; }; + 624AC90219FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624AC90019FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m */; }; 624AC90519FBFE9A00BD3C4A /* html5lib-tests in Resources */ = {isa = PBXBuildFile; fileRef = 624AC90419FBFE8A00BD3C4A /* html5lib-tests */; }; 624AC90619FBFEA000BD3C4A /* html5lib-tests in Resources */ = {isa = PBXBuildFile; fileRef = 624AC90419FBFE8A00BD3C4A /* html5lib-tests */; }; 624AC90E19FC702E00BD3C4A /* HTML Standard.html in Resources */ = {isa = PBXBuildFile; fileRef = 624AC90D19FC702E00BD3C4A /* HTML Standard.html */; }; @@ -63,15 +66,12 @@ 625A14C619C7829400AD0C32 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14AF19C7829400AD0C32 /* Cocoa.framework */; }; 625A14C919C7829400AD0C32 /* HTMLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14AC19C7829400AD0C32 /* HTMLKit.framework */; }; 625A14CF19C7829400AD0C32 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 625A14CD19C7829400AD0C32 /* InfoPlist.strings */; }; - 625A14D119C7829400AD0C32 /* HTMLKitTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A14D019C7829400AD0C32 /* HTMLKitTests.m */; }; 625A14E019C7834100AD0C32 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14DF19C7834100AD0C32 /* Foundation.framework */; }; 625A14ED19C7834100AD0C32 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14C419C7829400AD0C32 /* XCTest.framework */; }; 625A14EE19C7834100AD0C32 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14DF19C7834100AD0C32 /* Foundation.framework */; }; - 625A14F319C7834100AD0C32 /* libHTMLKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14DE19C7834000AD0C32 /* libHTMLKit.a */; }; 625A150219C783DE00AD0C32 /* HTMLKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A14BD19C7829400AD0C32 /* HTMLKit.m */; }; 625A150319C783E200AD0C32 /* HTMLKit.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 625A14BC19C7829400AD0C32 /* HTMLKit.h */; }; 625A150419C783EB00AD0C32 /* HTMLKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 625A14BC19C7829400AD0C32 /* HTMLKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 625A150519C783FD00AD0C32 /* HTMLKitTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A14D019C7829400AD0C32 /* HTMLKitTests.m */; }; 625A150819C78ABA00AD0C32 /* HTMLInputStreamReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 625A150619C78ABA00AD0C32 /* HTMLInputStreamReader.h */; }; 625A150919C78ABA00AD0C32 /* HTMLInputStreamReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A150719C78ABA00AD0C32 /* HTMLInputStreamReader.m */; }; 625A150A19C78ABA00AD0C32 /* HTMLInputStreamReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A150719C78ABA00AD0C32 /* HTMLInputStreamReader.m */; }; @@ -93,8 +93,8 @@ 62AE594919F9948A0043F069 /* HTMLCharacterToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 62AE594719F9948A0043F069 /* HTMLCharacterToken.h */; }; 62AE594A19F9948A0043F069 /* HTMLCharacterToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE594819F9948A0043F069 /* HTMLCharacterToken.m */; }; 62AE594B19F9948A0043F069 /* HTMLCharacterToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 62AE594819F9948A0043F069 /* HTMLCharacterToken.m */; }; - 62D8345919FB1AC4009205A9 /* HTML5LibTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 62D8345819FB1AC4009205A9 /* HTML5LibTest.m */; }; - 62D8345A19FB1AC4009205A9 /* HTML5LibTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 62D8345819FB1AC4009205A9 /* HTML5LibTest.m */; }; + 62D8345919FB1AC4009205A9 /* HTML5LibTokenizerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 62D8345819FB1AC4009205A9 /* HTML5LibTokenizerTest.m */; }; + 62D8345A19FB1AC4009205A9 /* HTML5LibTokenizerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 62D8345819FB1AC4009205A9 /* HTML5LibTokenizerTest.m */; }; 62F31FDD19E9DCCF007F0657 /* HTMLTokenizerEntities.h in Headers */ = {isa = PBXBuildFile; fileRef = 62F31FDB19E9DCCF007F0657 /* HTMLTokenizerEntities.h */; }; 62F31FDE19E9DCCF007F0657 /* HTMLTokenizerEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = 62F31FDC19E9DCCF007F0657 /* HTMLTokenizerEntities.m */; }; 62F31FDF19E9DCCF007F0657 /* HTMLTokenizerEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = 62F31FDC19E9DCCF007F0657 /* HTMLTokenizerEntities.m */; }; @@ -151,6 +151,7 @@ 62362A3F1A9FDE8A00301989 /* HTMLNodes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLNodes.h; sourceTree = ""; }; 62363C3B1ABE428200DAB4C6 /* HTMLListOfActiveFormattingElements.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLListOfActiveFormattingElements.h; sourceTree = ""; }; 62363C3C1ABE428200DAB4C6 /* HTMLListOfActiveFormattingElements.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLListOfActiveFormattingElements.m; sourceTree = ""; }; + 6236738D1AC0CE2500FF89B3 /* HTMLKitTokenizerPerformance.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitTokenizerPerformance.m; sourceTree = ""; }; 623719431AA12EE8002E03C8 /* HTMLQuirksMode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLQuirksMode.h; sourceTree = ""; }; 6238039D1AB63A8C008A53D0 /* HTMLEOFToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLEOFToken.h; sourceTree = ""; }; 6238039E1AB63A8C008A53D0 /* HTMLEOFToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLEOFToken.m; sourceTree = ""; }; @@ -168,8 +169,7 @@ 624493AA19CD0CBE00BCDDF4 /* HTMLToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLToken.h; sourceTree = ""; }; 624493AB19CD0CBE00BCDDF4 /* HTMLToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLToken.m; sourceTree = ""; }; 624AC8FE19FBF4F700BD3C4A /* HTMLTokens.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLTokens.h; sourceTree = ""; }; - 624AC90019FBF9ED00BD3C4A /* HTMLTokenizerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLTokenizerTests.m; sourceTree = ""; }; - 624AC90319FBFD1A00BD3C4A /* HTMLKitTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLKitTests.h; sourceTree = ""; }; + 624AC90019FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitTokenizerTests.m; sourceTree = ""; }; 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 = ""; }; 625A14AC19C7829400AD0C32 /* HTMLKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HTMLKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -186,7 +186,6 @@ 625A14C419C7829400AD0C32 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 625A14CC19C7829400AD0C32 /* HTMLKitTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "HTMLKitTests-Info.plist"; sourceTree = ""; }; 625A14CE19C7829400AD0C32 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 625A14D019C7829400AD0C32 /* HTMLKitTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HTMLKitTests.m; sourceTree = ""; }; 625A14DE19C7834000AD0C32 /* libHTMLKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libHTMLKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; 625A14DF19C7834100AD0C32 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 625A14EC19C7834100AD0C32 /* HTMLKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HTMLKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -206,8 +205,8 @@ 62AE594319F992F30043F069 /* HTMLCommentToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLCommentToken.m; sourceTree = ""; }; 62AE594719F9948A0043F069 /* HTMLCharacterToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLCharacterToken.h; sourceTree = ""; }; 62AE594819F9948A0043F069 /* HTMLCharacterToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLCharacterToken.m; sourceTree = ""; }; - 62D8345719FB1AC4009205A9 /* HTML5LibTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTML5LibTest.h; sourceTree = ""; }; - 62D8345819FB1AC4009205A9 /* HTML5LibTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTML5LibTest.m; sourceTree = ""; }; + 62D8345719FB1AC4009205A9 /* HTML5LibTokenizerTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTML5LibTokenizerTest.h; sourceTree = ""; }; + 62D8345819FB1AC4009205A9 /* HTML5LibTokenizerTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTML5LibTokenizerTest.m; sourceTree = ""; }; 62E7CAAE19CDFFB500465A83 /* HTMLTokenizerCharacters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLTokenizerCharacters.h; sourceTree = ""; }; 62F31FDB19E9DCCF007F0657 /* HTMLTokenizerEntities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLTokenizerEntities.h; sourceTree = ""; }; 62F31FDC19E9DCCF007F0657 /* HTMLTokenizerEntities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLTokenizerEntities.m; sourceTree = ""; }; @@ -228,9 +227,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 625A14C919C7829400AD0C32 /* HTMLKit.framework in Frameworks */, 625A14C619C7829400AD0C32 /* Cocoa.framework in Frameworks */, 625A14C519C7829400AD0C32 /* XCTest.framework in Frameworks */, - 625A14C919C7829400AD0C32 /* HTMLKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -246,15 +245,26 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 625A14ED19C7834100AD0C32 /* XCTest.framework in Frameworks */, + 6234CF571ABF892400B6077D /* libHTMLKit.a in Frameworks */, 625A14EE19C7834100AD0C32 /* Foundation.framework in Frameworks */, - 625A14F319C7834100AD0C32 /* libHTMLKit.a in Frameworks */, + 625A14ED19C7834100AD0C32 /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 6236738C1AC0CD2400FF89B3 /* Tokenizer */ = { + isa = PBXGroup; + children = ( + 62D8345719FB1AC4009205A9 /* HTML5LibTokenizerTest.h */, + 62D8345819FB1AC4009205A9 /* HTML5LibTokenizerTest.m */, + 624AC90019FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m */, + 6236738D1AC0CE2500FF89B3 /* HTMLKitTokenizerPerformance.m */, + ); + name = Tokenizer; + sourceTree = ""; + }; 623719441AA1472B002E03C8 /* Nodes */ = { isa = PBXGroup; children = ( @@ -362,11 +372,7 @@ 625A14CA19C7829400AD0C32 /* Tests */ = { isa = PBXGroup; children = ( - 62D8345719FB1AC4009205A9 /* HTML5LibTest.h */, - 62D8345819FB1AC4009205A9 /* HTML5LibTest.m */, - 624AC90319FBFD1A00BD3C4A /* HTMLKitTests.h */, - 625A14D019C7829400AD0C32 /* HTMLKitTests.m */, - 624AC90019FBF9ED00BD3C4A /* HTMLTokenizerTests.m */, + 6236738C1AC0CD2400FF89B3 /* Tokenizer */, 625A14CB19C7829400AD0C32 /* Supporting Files */, ); name = Tests; @@ -626,9 +632,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 624AC90219FBF9ED00BD3C4A /* HTMLTokenizerTests.m in Sources */, - 62D8345A19FB1AC4009205A9 /* HTML5LibTest.m in Sources */, - 625A14D119C7829400AD0C32 /* HTMLKitTests.m in Sources */, + 6236738F1AC0CE2500FF89B3 /* HTMLKitTokenizerPerformance.m in Sources */, + 624AC90219FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m in Sources */, + 62D8345A19FB1AC4009205A9 /* HTML5LibTokenizerTest.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -667,9 +673,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 624AC90119FBF9ED00BD3C4A /* HTMLTokenizerTests.m in Sources */, - 62D8345919FB1AC4009205A9 /* HTML5LibTest.m in Sources */, - 625A150519C783FD00AD0C32 /* HTMLKitTests.m in Sources */, + 6236738E1AC0CE2500FF89B3 /* HTMLKitTokenizerPerformance.m in Sources */, + 624AC90119FBF9ED00BD3C4A /* HTMLKitTokenizerTests.m in Sources */, + 62D8345919FB1AC4009205A9 /* HTML5LibTokenizerTest.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -811,7 +817,7 @@ 625A14D819C7829400AD0C32 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/HTMLKit.framework/Versions/A/HTMLKit"; + BUNDLE_LOADER = ""; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(DEVELOPER_FRAMEWORKS_DIR)", @@ -833,7 +839,7 @@ 625A14D919C7829400AD0C32 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/HTMLKit.framework/Versions/A/HTMLKit"; + BUNDLE_LOADER = ""; COMBINE_HIDPI_IMAGES = YES; FRAMEWORK_SEARCH_PATHS = ( "$(DEVELOPER_FRAMEWORKS_DIR)", @@ -884,7 +890,7 @@ 625A150019C7834100AD0C32 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/HTMLKit.framework/Versions/A/HTMLKit"; + BUNDLE_LOADER = ""; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", @@ -908,7 +914,7 @@ 625A150119C7834100AD0C32 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/HTMLKit.framework/Versions/A/HTMLKit"; + BUNDLE_LOADER = ""; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", diff --git a/HTMLKit.xcodeproj/xcshareddata/xcbaselines/625A14C219C7829400AD0C32.xcbaseline/5AB53A08-CDD0-43FB-B47F-2EE38B3FE707.plist b/HTMLKit.xcodeproj/xcshareddata/xcbaselines/625A14C219C7829400AD0C32.xcbaseline/5AB53A08-CDD0-43FB-B47F-2EE38B3FE707.plist index d33dc20..98a2c6e 100644 --- a/HTMLKit.xcodeproj/xcshareddata/xcbaselines/625A14C219C7829400AD0C32.xcbaseline/5AB53A08-CDD0-43FB-B47F-2EE38B3FE707.plist +++ b/HTMLKit.xcodeproj/xcshareddata/xcbaselines/625A14C219C7829400AD0C32.xcbaseline/5AB53A08-CDD0-43FB-B47F-2EE38B3FE707.plist @@ -4,6 +4,19 @@ classNames + HTMLKitTokenizerPerformance + + testTokenizerPerformance + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 14.55 + baselineIntegrationDisplayName + Local Baseline + + + HTMLTokenizerTests testTokenizerPerformance diff --git a/HTMLKitTests/HTML5LibTest.h b/HTMLKitTests/HTML5LibTokenizerTest.h similarity index 62% rename from HTMLKitTests/HTML5LibTest.h rename to HTMLKitTests/HTML5LibTokenizerTest.h index b8180bc..7e18af8 100644 --- a/HTMLKitTests/HTML5LibTest.h +++ b/HTMLKitTests/HTML5LibTokenizerTest.h @@ -8,13 +8,14 @@ #import -@interface HTML5LibTest : NSObject +@interface HTML5LibTokenizerTest : NSObject -@property (nonatomic, strong) NSString *title; -@property (nonatomic, strong) NSString *input; +@property (nonatomic, copy) NSString *testFile; +@property (nonatomic, copy) NSString *title; +@property (nonatomic, copy) NSString *input; @property (nonatomic, strong) NSArray *output; @property (nonatomic, strong) NSArray *initialStates; -@property (nonatomic, strong) NSString *lastStartTag; +@property (nonatomic, copy) NSString *lastStartTag; @property (nonatomic, assign) BOOL ignoreErrorOrder; - (instancetype)initWithTestDictionary:(NSDictionary *)dictionary; diff --git a/HTMLKitTests/HTML5LibTest.m b/HTMLKitTests/HTML5LibTokenizerTest.m similarity index 92% rename from HTMLKitTests/HTML5LibTest.m rename to HTMLKitTests/HTML5LibTokenizerTest.m index 93b7993..74fae15 100644 --- a/HTMLKitTests/HTML5LibTest.m +++ b/HTMLKitTests/HTML5LibTokenizerTest.m @@ -6,12 +6,11 @@ // Copyright (c) 2014 BrainCookie. All rights reserved. // -#import "HTML5LibTest.h" +#import "HTML5LibTokenizerTest.h" #import "HTMLTokenizerStates.h" #import "HTMLTokens.h" -@implementation HTML5LibTest - +@implementation HTML5LibTokenizerTest - (instancetype)initWithTestDictionary:(NSDictionary *)dictionary { @@ -94,10 +93,10 @@ } else if ([type isEqualToString:@"Comment"]) { return [[HTMLCommentToken alloc] initWithData:data]; } else if ([type isEqualToString:@"DOCTYPE"]) { - data = [[NSNull null] isEqualTo:data] ? nil : data; + data = [[NSNull null] isEqual:data] ? nil : data; HTMLDOCTYPEToken *token = [[HTMLDOCTYPEToken alloc] initWithName:data]; - token.publicIdentifier = [[NSNull null] isEqualTo:output[2]] ? nil : output[2]; - token.systemIdentifier = [[NSNull null] isEqualTo:output[3]] ? nil : output[3]; + token.publicIdentifier = [[NSNull null] isEqual:output[2]] ? nil : output[2]; + token.systemIdentifier = [[NSNull null] isEqual:output[3]] ? nil : output[3]; token.forceQuirks = ([output[4] boolValue] == NO); return token; } else if ([type isEqualToString:@"EndTag"]) { @@ -145,4 +144,9 @@ return string; } +- (NSString *)description +{ + return self.title; +} + @end diff --git a/HTMLKitTests/HTMLKitTests.h b/HTMLKitTests/HTMLKitTests.h deleted file mode 100644 index 11c586b..0000000 --- a/HTMLKitTests/HTMLKitTests.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// HTMLKitTests.h -// HTMLKit -// -// Created by Iska on 25/10/14. -// Copyright (c) 2014 BrainCookie. All rights reserved. -// - -#import -#import "HTML5LibTest.h" - -@interface HTMLKitTests : XCTestCase - -- (NSArray *)loadTests:(NSString *)testsFile forComponent:(NSString *)component; - -@end \ No newline at end of file diff --git a/HTMLKitTests/HTMLKitTests.m b/HTMLKitTests/HTMLKitTests.m deleted file mode 100644 index 63e47ea..0000000 --- a/HTMLKitTests/HTMLKitTests.m +++ /dev/null @@ -1,35 +0,0 @@ -// -// HTMLKitTests.m -// HTMLKitTests -// -// Created by Iska on 15/09/14. -// Copyright (c) 2014 BrainCookie. All rights reserved. -// - -#import "HTMLKitTests.h" - -static NSString * const HTML5LibTests = @"html5lib-tests"; - -@implementation HTMLKitTests - -- (NSArray *)loadTests:(NSString *)testsFile forComponent:(NSString *)component -{ - NSString *path = [[NSBundle bundleForClass:self.class] resourcePath]; - path = [path stringByAppendingPathComponent:HTML5LibTests]; - path = [path stringByAppendingPathComponent:component]; - path = [path stringByAppendingPathComponent:testsFile]; - - NSString *json = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; - NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] - options:0 - error:nil]; - NSArray *jsonTests = [dictionary objectForKey:@"tests"]; - - NSMutableArray *tests = [NSMutableArray array]; - for (NSDictionary *test in jsonTests) { - [tests addObject:[[HTML5LibTest alloc] initWithTestDictionary:test]]; - } - return tests; -} - -@end diff --git a/HTMLKitTests/HTMLKitTokenizerPerformance.m b/HTMLKitTests/HTMLKitTokenizerPerformance.m new file mode 100644 index 0000000..9aa8cfa --- /dev/null +++ b/HTMLKitTests/HTMLKitTokenizerPerformance.m @@ -0,0 +1,37 @@ +// +// HTMLKitTokenizerPerformance.m +// HTMLKit +// +// Created by Iska on 23/03/15. +// Copyright (c) 2015 BrainCookie. All rights reserved. +// + +#import +#import "HTMLTokenizer.h" +#import "HTMLTokenizerStates.h" +#import "HTMLTokens.h" + +@interface HTMLKitTokenizerPerformance : XCTestCase + +@end + +@implementation HTMLKitTokenizerPerformance + +- (void)testTokenizerPerformance +{ + NSString *path = [[NSBundle bundleForClass:self.class] resourcePath]; + path = [path stringByAppendingPathComponent:@"HTML Standard.html"]; + + NSString *string = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; + + [self measureBlock:^{ + HTMLTokenizer *tokenizer = [[HTMLTokenizer alloc] initWithString:string]; + + id token = nil; + do { + token = [tokenizer nextObject]; + } while (token != nil); + }]; +} + +@end diff --git a/HTMLKitTests/HTMLKitTokenizerTests.m b/HTMLKitTests/HTMLKitTokenizerTests.m new file mode 100644 index 0000000..acc769b --- /dev/null +++ b/HTMLKitTests/HTMLKitTokenizerTests.m @@ -0,0 +1,145 @@ +// +// HTMLTokenizerTests.m +// HTMLKit +// +// Created by Iska on 25/10/14. +// Copyright (c) 2014 BrainCookie. All rights reserved. +// + +#import +#import "HTML5LibTokenizerTest.h" + +#import "HTMLTokenizer.h" +#import "HTMLTokenizerStates.h" +#import "HTMLTokens.h" + +#import "HTMLParser.h" +#import "HTMLDocument.h" + +static NSString * const HTML5LibTests = @"html5lib-tests"; +static NSString * const TOKENIZER = @"tokenizer"; + +#pragma mark - Extensions + +@implementation HTMLParseErrorToken (Testing) + +- (BOOL)isEqual:(id)object +{ + return [object isKindOfClass:[HTMLParseErrorToken class]]; +} + +@end + +#pragma mark - HTML5Lib Test Suite + +@interface HTMLKitTokenizerTests : XCTestCase +@property (nonatomic, strong) NSString *testFile; +@property (nonatomic, strong) NSArray *testsList; +@end + +@implementation HTMLKitTokenizerTests + ++ (XCTestSuite *)defaultTestSuite +{ + XCTestSuite *suite = [[XCTestSuite alloc] initWithName:NSStringFromClass(self)]; + + NSDictionary *testsMap = [self loadHTML5LibTokenizerTests]; + [testsMap enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + [self addTestCaseForTestFile:key withTests:obj toTestSuite:suite]; + }]; + + return suite; +} + ++ (void)addTestCaseForTestFile:(NSString *)testFile withTests:(NSArray *)tests toTestSuite:(XCTestSuite *)suite +{ + NSArray *allInvocations = [self testInvocations]; + for (NSInvocation *invocation in allInvocations) { + XCTestCase *testCase = [[self alloc] initWithInvocation:invocation + testFile:testFile + tests:tests]; + [suite addTest:testCase]; + } +} + ++ (NSDictionary *)loadHTML5LibTokenizerTests +{ + NSString *path = [[NSBundle bundleForClass:self.class] resourcePath]; + path = [path stringByAppendingPathComponent:HTML5LibTests]; + path = [path stringByAppendingPathComponent:TOKENIZER]; + + NSMutableDictionary *testsMap = [NSMutableDictionary dictionary]; + NSArray *testFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil]; + + for (NSString *testFile in testFiles) { + if (![testFile.pathExtension isEqualToString:@"test"]) { + continue; + } + + NSString *jsonPath = [path stringByAppendingPathComponent:testFile]; + NSString *json = [NSString stringWithContentsOfFile:jsonPath encoding:NSUTF8StringEncoding error:nil]; + NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding]; + + NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data + options:0 + error:nil]; + NSArray *jsonTests = [dictionary objectForKey:@"tests"]; + NSMutableArray *tests = [NSMutableArray array]; + + for (NSDictionary *test in jsonTests) { + HTML5LibTokenizerTest *html5libTest = [[HTML5LibTokenizerTest alloc] initWithTestDictionary:test]; + html5libTest.testFile = testFile.stringByDeletingPathExtension; + [tests addObject:html5libTest]; + } + [testsMap setObject:tests forKey:testFile]; + } + + return testsMap; +} + +#pragma mark - Instance + +- (instancetype)initWithInvocation:(NSInvocation *)invocation + testFile:(NSString *)testFile + tests:(NSArray *)tests +{ + self = [super initWithInvocation:invocation]; + if (self) { + _testFile = testFile; + _testsList = tests; + } + return self; +} + +- (NSString *)name +{ + NSInvocation *invocation = [self invocation]; + NSString *title = self.testFile.stringByDeletingPathExtension; + return [NSString stringWithFormat:@"-[%@ %@_%@]", self.class, NSStringFromSelector(invocation.selector), title]; +} + +- (NSString *)description +{ + return self.name; +} + +#pragma mark - Tests + +- (void)testTokenizer +{ + for (HTML5LibTokenizerTest *test in self.testsList) { + HTMLTokenizer *tokenizer = [[HTMLTokenizer alloc] initWithString:test.input]; + [tokenizer setValue:test.lastStartTag forKey:@"_lastStartTagName"]; + + for (NSNumber *state in test.initialStates) { + + tokenizer.state = [state integerValue]; + + NSArray *expectedTokens = test.output; + NSArray *tokens = [tokenizer allObjects]; + XCTAssertEqualObjects(tokens, expectedTokens, @"%@", test.title); + } + } +} + +@end diff --git a/HTMLKitTests/HTMLTokenizerTests.m b/HTMLKitTests/HTMLTokenizerTests.m deleted file mode 100644 index c570363..0000000 --- a/HTMLKitTests/HTMLTokenizerTests.m +++ /dev/null @@ -1,153 +0,0 @@ -// -// HTMLTokenizerTests.m -// HTMLKit -// -// Created by Iska on 25/10/14. -// Copyright (c) 2014 BrainCookie. All rights reserved. -// - -#import -#import -#import "HTMLKitTests.h" -#import "HTML5LibTest.h" - -#import "HTMLTokenizer.h" -#import "HTMLTokenizerStates.h" -#import "HTMLTokens.h" - -static NSString * const TOKENIZER = @"tokenizer"; - -@implementation HTMLParseErrorToken (Testing) - -- (BOOL)isEqual:(id)object -{ - return [object isKindOfClass:[HTMLParseErrorToken class]]; -} - -@end - -@interface HTMLTokenizerTests : HTMLKitTests - -@end - -@implementation HTMLTokenizerTests - -- (void)setUp -{ - [super setUp]; - // Put setup code here. This method is called before the invocation of each test method in the class. -} - -- (void)tearDown -{ - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - -- (void)runTests:(NSString *)testsFile -{ - NSArray *tests = [self loadTests:testsFile forComponent:TOKENIZER]; - for (HTML5LibTest *test in tests) { - - HTMLTokenizer *tokenizer = [[HTMLTokenizer alloc] initWithString:test.input]; - [tokenizer setValue:test.lastStartTag forKey:@"_lastStartTagName"]; - - for (NSNumber *state in test.initialStates) { - - tokenizer.state = [state integerValue]; - - NSArray *expectedTokens = test.output; - NSArray *tokens = [tokenizer allObjects]; - XCTAssertEqualObjects(tokens, expectedTokens, @"%@", test.title); - } - } -} - -- (void)test_contentModelFlags -{ - [self runTests:@"contentModelFlags.test"]; -} - -- (void)test_domjs -{ - [self runTests:@"domjs.test"]; -} - -- (void)test_entities -{ - [self runTests:@"entities.test"]; -} - -- (void)test_escapeFlag -{ - [self runTests:@"escapeFlag.test"]; -} - -- (void)test_namedEntities -{ - [self runTests:@"namedEntities.test"]; -} - -- (void)test_numericEntities -{ - [self runTests:@"numericEntities.test"]; -} - -- (void)test_pendingSpecChanges -{ - [self runTests:@"pendingSpecChanges.test" ]; -} - -- (void)test_test1 -{ - [self runTests:@"test1.test" ]; -} - -- (void)test_test2 -{ - [self runTests:@"test2.test" ]; -} - -- (void)test_test3 -{ - [self runTests:@"test3.test" ]; -} - -- (void)test_test4 -{ - [self runTests:@"test4.test" ]; -} - -- (void)test_unicodeChars -{ - [self runTests:@"unicodeChars.test" ]; -} - -- (void)test_unicodeCharsProblematic -{ - [self runTests:@"unicodeCharsProblematic.test" ]; -} - -- (void)test_xmlViolation -{ - [self runTests:@"xmlViolation.test" ]; -} - -- (void)testTokenizerPerformance -{ - NSString *path = [[NSBundle bundleForClass:self.class] resourcePath]; - path = [path stringByAppendingPathComponent:@"HTML Standard.html"]; - - NSString *string = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; - - [self measureBlock:^{ - HTMLTokenizer *tokenizer = [[HTMLTokenizer alloc] initWithString:string]; - - id token = nil; - do { - token = [tokenizer nextObject]; - } while (token != nil); - }]; -} - -@end