public IEnumerable<IndexEntry> Index(Document document)
 {
     return IndexParser.GetEqExpressions(_indexText)
         .Select(eqExpression => document.FindValues(eqExpression.Item1.FullPath).Cast<Tuple<string,object>>().Select(t => t.Item1 + "=" + t.Item2))
         .CartesianProduct()
         .Select(combination => new IndexEntry(combination));
 }
 public void FindValues_WithThreePartPath_ShouldReturnAttributeValue()
 {
     var target = new Document();
     object expected = new Tuple<string,object>("foo/bar/quux","baz");
     target.GetSubDocument("foo").GetSubDocument("bar").SetAttribute("quux", "baz");
     var actual = target.FindValues("foo/bar/quux").Single();
     Assert.AreEqual(expected, actual, "GetAttributeReturnedDifferentValueFromSet");
 }
 public void FindValues_WithTwoPartPath_ShouldReturnSubDocumentAttributeValue()
 {
     var target = new Document();
     const string value = "bar";
     object expected = new Tuple<string,object>("foo/foo","bar");
     target.GetSubDocument("foo").SetAttribute("foo", value);
     var actual = target.FindValues("foo/foo").Single();
     Assert.AreEqual(expected, actual, "GetAttributeReturnedDifferentValueFromSet");
 }
 public void FindValues_WithAttributeName_ShouldReturnAttributeValue()
 {
     var target = new Document();
     const string name = "foo";
     const string value = "bar";
     object expected = new Tuple<string,object>(name,value);
     target.SetAttribute(name, value);
     var actual = target.FindValues(name).Single();
     Assert.AreEqual(expected, actual, "GetAttributeReturnedDifferentValueFromSet");
 }