github.com/matislovas/ratago@v0.0.0-20240408115641-cc0857415a7a/xslt/match_test.go (about) 1 package xslt 2 3 //import "github.com/matislovas/gokogiri/xml" 4 //import "unicode/utf8" 5 import "testing" 6 7 func compareStep(t *testing.T, m *MatchStep, op StepOperation, val string) { 8 if m.Op != op || val != m.Value { 9 t.Error("Expected", op, "=", val, "\nActual ", m.Op, "=", m.Value) 10 } 11 } 12 13 func TestPatternSimple(t *testing.T) { 14 steps := parseMatchPattern("test") 15 compareStep(t, steps[0], OP_ELEM, "test") 16 } 17 18 func TestPatternParent(t *testing.T) { 19 steps := parseMatchPattern("foo/bar") 20 compareStep(t, steps[0], OP_ELEM, "bar") 21 compareStep(t, steps[1], OP_PARENT, "/") 22 compareStep(t, steps[2], OP_ELEM, "foo") 23 } 24 25 func TestPatternRootParent(t *testing.T) { 26 steps := parseMatchPattern("/bar") 27 compareStep(t, steps[0], OP_ELEM, "bar") 28 compareStep(t, steps[1], OP_PARENT, "") 29 compareStep(t, steps[2], OP_ROOT, "/") 30 compareStep(t, steps[3], OP_END, "") 31 } 32 33 func TestPatternRootWildcard(t *testing.T) { 34 steps := parseMatchPattern("/*") 35 compareStep(t, steps[0], OP_ALL, "*") 36 compareStep(t, steps[1], OP_PARENT, "") 37 compareStep(t, steps[2], OP_ROOT, "/") 38 compareStep(t, steps[3], OP_END, "") 39 } 40 41 func TestPatternAncestor(t *testing.T) { 42 steps := parseMatchPattern("foo//bar") 43 compareStep(t, steps[0], OP_ELEM, "bar") 44 compareStep(t, steps[1], OP_ANCESTOR, "//") 45 compareStep(t, steps[2], OP_ELEM, "foo") 46 } 47 48 func TestPatternRootAncestor(t *testing.T) { 49 steps := parseMatchPattern("//bar") 50 compareStep(t, steps[0], OP_ELEM, "bar") 51 compareStep(t, steps[1], OP_END, "") 52 } 53 54 func TestPatternAttrib(t *testing.T) { 55 steps := parseMatchPattern("@test") 56 compareStep(t, steps[0], OP_ATTR, "test") 57 } 58 59 func TestPatternWildcardAttrib(t *testing.T) { 60 steps := parseMatchPattern("@*") 61 compareStep(t, steps[0], OP_ATTR, "*") 62 compareStep(t, steps[1], OP_END, "") 63 } 64 65 func TestPatternNodeTestAttrib(t *testing.T) { 66 steps := parseMatchPattern("@node()") 67 compareStep(t, steps[0], OP_ATTR, "*") 68 compareStep(t, steps[1], OP_END, "") 69 } 70 71 func TestPatternAttribWithParent(t *testing.T) { 72 steps := parseMatchPattern("foo/@bar") 73 compareStep(t, steps[0], OP_ATTR, "bar") 74 compareStep(t, steps[1], OP_PARENT, "/") 75 compareStep(t, steps[2], OP_ELEM, "foo") 76 } 77 78 func TestPatternNodeType(t *testing.T) { 79 steps := parseMatchPattern("node()") 80 compareStep(t, steps[0], OP_NODE, "()") 81 } 82 func TestPatternCommentType(t *testing.T) { 83 steps := parseMatchPattern("comment()") 84 compareStep(t, steps[0], OP_COMMENT, "()") 85 } 86 func TestPatternTextType(t *testing.T) { 87 steps := parseMatchPattern("text()") 88 compareStep(t, steps[0], OP_TEXT, "()") 89 } 90 func TestPatternPiType(t *testing.T) { 91 steps := parseMatchPattern("processing-instruction()") 92 compareStep(t, steps[0], OP_PI, "()") 93 } 94 func TestPatternAll(t *testing.T) { 95 steps := parseMatchPattern("*") 96 compareStep(t, steps[0], OP_ALL, "*") 97 } 98 func TestPatternParentAll(t *testing.T) { 99 steps := parseMatchPattern("foo/*") 100 compareStep(t, steps[0], OP_ALL, "*") 101 compareStep(t, steps[1], OP_PARENT, "/") 102 compareStep(t, steps[2], OP_ELEM, "foo") 103 } 104 105 func TestPatternPred(t *testing.T) { 106 steps := parseMatchPattern("item[position()=1]") 107 compareStep(t, steps[0], OP_ELEM, "item") 108 compareStep(t, steps[1], OP_PREDICATE, "position()=1") 109 } 110 111 func TestPatternNonTerminalPred(t *testing.T) { 112 steps := parseMatchPattern("item[position()=1]/foo") 113 compareStep(t, steps[0], OP_ELEM, "foo") 114 compareStep(t, steps[1], OP_PARENT, "/") 115 compareStep(t, steps[2], OP_ELEM, "item") 116 compareStep(t, steps[3], OP_PREDICATE, "position()=1") 117 } 118 119 func TestPatternNestedPred(t *testing.T) { 120 steps := parseMatchPattern("list[item[@foo='bar']]") 121 compareStep(t, steps[0], OP_ELEM, "list") 122 compareStep(t, steps[1], OP_PREDICATE, "item[@foo='bar']") 123 } 124 125 func TestPatternNamespace(t *testing.T) { 126 steps := parseMatchPattern("foo:bar") 127 compareStep(t, steps[0], OP_ELEM, "bar") 128 compareStep(t, steps[1], OP_NS, "foo") 129 } 130 131 func TestPatternAxis(t *testing.T) { 132 steps := parseMatchPattern("foo/child::bar") 133 compareStep(t, steps[0], OP_ELEM, "bar") 134 compareStep(t, steps[1], OP_PARENT, "/") 135 compareStep(t, steps[2], OP_ELEM, "foo") 136 } 137 138 func TestPatternAttributeAxis(t *testing.T) { 139 steps := parseMatchPattern("foo/attribute::bar") 140 compareStep(t, steps[0], OP_ATTR, "bar") 141 compareStep(t, steps[1], OP_PARENT, "/") 142 compareStep(t, steps[2], OP_ELEM, "foo") 143 } 144 145 func TestPatternChildAxis(t *testing.T) { 146 steps := parseMatchPattern("child::bar") 147 compareStep(t, steps[0], OP_ELEM, "bar") 148 compareStep(t, steps[1], OP_END, "") 149 } 150 151 func TestPatternOr(t *testing.T) { 152 steps := parseMatchPattern("foo|bar") 153 compareStep(t, steps[0], OP_ELEM, "bar") 154 compareStep(t, steps[1], OP_OR, "|") 155 compareStep(t, steps[2], OP_ELEM, "foo") 156 compareStep(t, steps[3], OP_END, "") 157 } 158 159 func TestPatternOrAtrr(t *testing.T) { 160 steps := parseMatchPattern("@foo|bar") 161 compareStep(t, steps[0], OP_ELEM, "bar") 162 compareStep(t, steps[1], OP_OR, "|") 163 compareStep(t, steps[2], OP_ATTR, "foo") 164 compareStep(t, steps[3], OP_END, "") 165 }