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  }