import Testing @testable import LegadoCore struct HTMLRuleEvaluatorTests { private let evaluator = HTMLRuleEvaluator() private let html = """
""" @Test func legacyListChainsPreserveTableRowsAndCurrentElementOutputs() throws { let page = "| 书名 | |
|---|---|
| 测试书 | 作者 |
Intro A
"]) #expect(try evaluator.extractCSS("a@all", html: fragments[0]).first?.contains("href=\"/a\"") == true) } @Test func selectsXPathFragmentsAndScalarValues() throws { let fragments = try evaluator.selectXPathFragments("//li[@class='book']", html: html) #expect(fragments.count == 2) #expect(try evaluator.extractXPath("//span[@class='title']/text()", html: fragments[1]) == ["B"]) #expect(try evaluator.extractXPath("count(//li[@class='book'])", html: html) == ["2"]) } @Test func ruleEngineAppliesHTMLCombination() async { let engine = RuleEngine() let result = await engine.evaluate("@CSS:.missing@text||@CSS:.title@text", inText: html) #expect(result.strings == ["A & One", "B"]) #expect(result.diagnostics.isEmpty) } @Test func supportsLegadoChainAndIndexedSelectors() throws { #expect(try evaluator.extractCSS("id.books@tag.li[1]@class.title@text", html: html) == ["B"]) #expect(try evaluator.extractCSS("li.book[-1:0]@class.title@text", html: html) == ["B", "A & One"]) #expect(try evaluator.extractCSS("li.book[!0]@class.title@text", html: html) == ["B"]) } @Test func supportsLegacyOutputOnlyRulesOnCurrentDocument() throws { #expect(try evaluator.extractCSS("@text", html: "0
1
2
3
4
" #expect(try evaluator.extractCSS("p[0:4:-2]@text", html: value) == ["0", "3"]) } @Test func rangeWhollyOutsideOneSideIsIgnoredInsteadOfClamped() throws { let value = "0
1
2
" #expect(try evaluator.extractCSS("p[8:9]@text", html: value).isEmpty) #expect(try evaluator.extractCSS("p[-9:-8]@text", html: value).isEmpty) #expect(try evaluator.extractCSS("p[-9:1]@text", html: value) == ["0", "1"]) } }