From 55bb8effb28ee666dac9fb2a69f611c62fcad564 Mon Sep 17 00:00:00 2001 From: iska Date: Fri, 23 Oct 2015 23:48:29 +0200 Subject: [PATCH] Add tests for the CSS Combinator selectors --- HTMLKit.xcodeproj/project.pbxproj | 6 ++ HTMLKit/CSSCombinatorSelector.m | 2 +- HTMLKitTests/CSSCombinatorSelectorTests.m | 116 ++++++++++++++++++++++ 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 HTMLKitTests/CSSCombinatorSelectorTests.m diff --git a/HTMLKit.xcodeproj/project.pbxproj b/HTMLKit.xcodeproj/project.pbxproj index 0770a06..7bd8161 100644 --- a/HTMLKit.xcodeproj/project.pbxproj +++ b/HTMLKit.xcodeproj/project.pbxproj @@ -16,6 +16,8 @@ 620EE9491BC46F2A0028ED34 /* CSSPseudoClassSelector.h in Headers */ = {isa = PBXBuildFile; fileRef = 620EE9471BC46F2A0028ED34 /* CSSPseudoClassSelector.h */; settings = {ASSET_TAGS = (); }; }; 620EE94A1BC46F2A0028ED34 /* CSSPseudoClassSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 620EE9481BC46F2A0028ED34 /* CSSPseudoClassSelector.m */; settings = {ASSET_TAGS = (); }; }; 620EE94B1BC46F2A0028ED34 /* CSSPseudoClassSelector.m in Sources */ = {isa = PBXBuildFile; fileRef = 620EE9481BC46F2A0028ED34 /* CSSPseudoClassSelector.m */; settings = {ASSET_TAGS = (); }; }; + 621FBE5D1BDAD90200BC9555 /* CSSCombinatorSelectorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 621FBE5C1BDAD90200BC9555 /* CSSCombinatorSelectorTests.m */; settings = {ASSET_TAGS = (); }; }; + 621FBE5E1BDAD90200BC9555 /* CSSCombinatorSelectorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 621FBE5C1BDAD90200BC9555 /* CSSCombinatorSelectorTests.m */; settings = {ASSET_TAGS = (); }; }; 623406E11ADB04F9004677A3 /* HTMLTemplate.h in Headers */ = {isa = PBXBuildFile; fileRef = 623406DF1ADB04F9004677A3 /* HTMLTemplate.h */; }; 623406E21ADB04F9004677A3 /* HTMLTemplate.m in Sources */ = {isa = PBXBuildFile; fileRef = 623406E01ADB04F9004677A3 /* HTMLTemplate.m */; }; 623406E31ADB04F9004677A3 /* HTMLTemplate.m in Sources */ = {isa = PBXBuildFile; fileRef = 623406E01ADB04F9004677A3 /* HTMLTemplate.m */; }; @@ -232,6 +234,7 @@ 620C877A1BD44CBE00FB3EEE /* CSSCompoundSelector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSCompoundSelector.m; sourceTree = ""; }; 620EE9471BC46F2A0028ED34 /* CSSPseudoClassSelector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSPseudoClassSelector.h; sourceTree = ""; }; 620EE9481BC46F2A0028ED34 /* CSSPseudoClassSelector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSPseudoClassSelector.m; sourceTree = ""; }; + 621FBE5C1BDAD90200BC9555 /* CSSCombinatorSelectorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSCombinatorSelectorTests.m; sourceTree = ""; }; 6223211D1A969B9300BACED5 /* HTMLElementTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HTMLElementTypes.h; sourceTree = ""; }; 623406DF1ADB04F9004677A3 /* HTMLTemplate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLTemplate.h; sourceTree = ""; }; 623406E01ADB04F9004677A3 /* HTMLTemplate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLTemplate.m; sourceTree = ""; }; @@ -602,6 +605,7 @@ 624AB3191B050A4D00F3830D /* CSSAttributeSelectorTests.m */, 628AF62E1BC99A6C00496128 /* CSSNthExpressionsParserTests.m */, 62F6586F1BD83C8E0045F137 /* CSSNThExpressionSelectorTests.m */, + 621FBE5C1BDAD90200BC9555 /* CSSCombinatorSelectorTests.m */, ); name = Tests; path = HTMLKitTests; @@ -959,6 +963,7 @@ 62D8345A19FB1AC4009205A9 /* HTML5LibTokenizerTest.m in Sources */, 6239755F1AC364BB007E26F1 /* HTML5LibTreeConstructionTest.m in Sources */, 624FC37B1AE591D80015DDF9 /* HTMLKitNodesTests.m in Sources */, + 621FBE5E1BDAD90200BC9555 /* CSSCombinatorSelectorTests.m in Sources */, 628AF6301BC99A6C00496128 /* CSSNthExpressionsParserTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1033,6 +1038,7 @@ 62D8345919FB1AC4009205A9 /* HTML5LibTokenizerTest.m in Sources */, 6239755E1AC364BB007E26F1 /* HTML5LibTreeConstructionTest.m in Sources */, 624FC37A1AE591D80015DDF9 /* HTMLKitNodesTests.m in Sources */, + 621FBE5D1BDAD90200BC9555 /* CSSCombinatorSelectorTests.m in Sources */, 628AF62F1BC99A6C00496128 /* CSSNthExpressionsParserTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/HTMLKit/CSSCombinatorSelector.m b/HTMLKit/CSSCombinatorSelector.m index d5263cc..c75e608 100644 --- a/HTMLKit/CSSCombinatorSelector.m +++ b/HTMLKit/CSSCombinatorSelector.m @@ -73,7 +73,7 @@ - (BOOL)acceptElement:(HTMLElement *)element { HTMLElement *parent = element.parentElement; - return parent != nil && [self.selector acceptElement:element]; + return parent != nil && [self.selector acceptElement:parent]; } - (NSString *)debugDescription diff --git a/HTMLKitTests/CSSCombinatorSelectorTests.m b/HTMLKitTests/CSSCombinatorSelectorTests.m new file mode 100644 index 0000000..4296068 --- /dev/null +++ b/HTMLKitTests/CSSCombinatorSelectorTests.m @@ -0,0 +1,116 @@ +// +// CSSCombinatorSelectorTests.m +// HTMLKit +// +// Created by Iska on 23/10/15. +// Copyright © 2015 BrainCookie. All rights reserved. +// + +#import +#import "CSSSelectors.h" +#import "HTMLParser.h" +#import "HTMLDOM.h" + +@interface CSSCombinatorSelectorTests : XCTestCase +{ + HTMLDocument *_document; +} +@end + +@implementation CSSCombinatorSelectorTests + +- (void)setUp +{ + [super setUp]; + + /* + | + |

+ | A paragraphA span + | + | + | + | + | + | + | + | + |
+ | Span in table + |
+ |

+ |
+ |

+ |
+ |
+ |

+ |
+ | + */ + _document = [[[HTMLParser alloc] initWithString:@"" + "

" + "A paragraphA span" + "" + "" + "" + "" + "" + "" + "
" + "Span in table" + "
" + "

" + "
" + "

" + "
" + "
" + "

" + "
" + ""] document]; +} + +-(void)testChildOfElementCombinator +{ + NSArray *elements = [_document elementsMatchingSelector:childOfElementSelector(typeSelector(@"body"))]; + NSArray *expected = @[@"p1", @"inner-div1", @"inner-div2"]; + XCTAssertEqualObjects([elements valueForKeyPath:@"attributes.id"], expected); + + elements = [_document elementsMatchingSelector:childOfElementSelector(typeSelector(@"p"))]; + expected = @[@"span1", @"table"]; + XCTAssertEqualObjects([elements valueForKeyPath:@"attributes.id"], expected); +} + +-(void)testDescendantOfElementCombinator +{ + NSArray *elements = [_document elementsMatchingSelector:descendantOfElementSelector(typeSelector(@"p"))]; + NSArray *expected = @[@"span1", @"table", @"tbody", @"tr1", @"td", @"span2", @"tr2", @"tr3"]; + XCTAssertEqualObjects([elements valueForKeyPath:@"attributes.id"], expected); + + elements = [_document elementsMatchingSelector:descendantOfElementSelector(typeSelector(@"table"))]; + expected = @[@"tbody", @"tr1", @"td", @"span2", @"tr2", @"tr3"]; + XCTAssertEqualObjects([elements valueForKeyPath:@"attributes.id"], expected); +} + +-(void)testAdjacentSiblingCombinator +{ + NSArray *elements = [_document elementsMatchingSelector:adjacentSiblingSelector(typeSelector(@"tr"))]; + NSArray *expected = @[@"tr2", @"tr3"]; + XCTAssertEqualObjects([elements valueForKeyPath:@"attributes.id"], expected); + + elements = [_document elementsMatchingSelector:adjacentSiblingSelector(typeSelector(@"p"))]; + expected = @[@"inner-div1"]; + XCTAssertEqualObjects([elements valueForKeyPath:@"attributes.id"], expected); +} + +-(void)testGeneralSiblingCombinator +{ + NSArray *elements = [_document elementsMatchingSelector:generalSiblingSelector(typeSelector(@"tr"))]; + NSArray *expected = @[@"tr2", @"tr3"]; + XCTAssertEqualObjects([elements valueForKeyPath:@"attributes.id"], expected); + + elements = [_document elementsMatchingSelector:generalSiblingSelector(typeSelector(@"p"))]; + expected = @[@"inner-div1", @"inner-div2"]; + XCTAssertEqualObjects([elements valueForKeyPath:@"attributes.id"], expected); +} + +@end