spec/matchers.rb in rdf-rdfa-0.3.1.2 vs spec/matchers.rb in rdf-rdfa-0.3.3

- old
+ new

@@ -1,171 +1,106 @@ -module Matchers - class BeEquivalentGraph - Info = Struct.new(:about, :information, :trace, :compare, :inputDocument, :outputDocument) - def normalize(graph) - case graph - when RDF::Graph then graph - when IO, StringIO - RDF::Graph.new.load(graph, :base_uri => @info.about) - else - # Figure out which parser to use - g = RDF::Graph.new - reader_class = detect_format(graph) - reader_class.new(graph, :base_uri => @info.about).each {|s| g << s} - g - end - end - - def initialize(expected, info) - @info = if info.respond_to?(:about) - info - elsif info.is_a?(Hash) - identifier = info[:identifier] || expected.is_a?(RDF::Graph) ? expected.context : info[:about] - trace = info[:trace] - trace = trace.join("\n") if trace.is_a?(Array) - Info.new(identifier, info[:information] || "", trace, info[:compare]) - else - Info.new(expected.is_a?(RDF::Graph) ? expected.context : info, info.to_s) - end - @expected = normalize(expected) - end +require 'rspec/matchers' +require 'sparql/grammar' - def matches?(actual) - @actual = normalize(actual) - @actual == @expected +RSpec::Matchers.define :have_xpath do |xpath, value| + match do |actual| + @doc = Nokogiri::XML.parse(actual) + @doc.should be_a(Nokogiri::XML::Document) + @doc.root.should be_a(Nokogiri::XML::Element) + @namespaces = @doc.namespaces.merge("xhtml" => "http://www.w3.org/1999/xhtml", "xml" => "http://www.w3.org/XML/1998/namespace") + case value + when false + @doc.root.at_xpath(xpath, @namespaces).should be_nil + when true + @doc.root.at_xpath(xpath, @namespaces).should_not be_nil + when Array + @doc.root.at_xpath(xpath, @namespaces).to_s.split(" ").should include(*value) + when Regexp + @doc.root.at_xpath(xpath, @namespaces).to_s.should =~ value + else + @doc.root.at_xpath(xpath, @namespaces).to_s.should == value end - - def failure_message_for_should - info = @info.respond_to?(:information) ? @info.information : @info.inspect - if @expected.is_a?(RDF::Graph) && @actual.size != @expected.size - "Graph entry count differs:\nexpected: #{@expected.size}\nactual: #{@actual.size}" - elsif @expected.is_a?(Array) && @actual.size != @expected.length - "Graph entry count differs:\nexpected: #{@expected.length}\nactual: #{@actual.size}" - else - "Graph differs" - end + - "\n#{info + "\n" unless info.empty?}" + - (@info.inputDocument ? "Input file: #{@info.inputDocument}\n" : "") + - (@info.outputDocument ? "Output file: #{@info.outputDocument}\n" : "") + - "Unsorted Expected:\n#{@expected.to_ntriples}" + - "Unsorted Results:\n#{@actual.to_ntriples}" + - (@info.trace ? "\nDebug:\n#{@info.trace}" : "") - end - def negative_failure_message - "Graphs do not differ\n" - end end - def be_equivalent_graph(expected, info = nil) - BeEquivalentGraph.new(expected, info) + failure_message_for_should do |actual| + msg = "expected that #{xpath.inspect} would be #{value.inspect} in:\n" + actual.to_s + msg += "was: #{@doc.root.at_xpath(xpath, @namespaces)}" end +end - # Run expected SPARQL query against actual - if $redland_enabled - class PassQuery - def initialize(expected, info) - @expected = expected - @query = Redland::Query.new(expected) - @info = info - #puts "PassQuery: expected #{expected.inspect}" - end - def matches?(actual) - @actual = actual - @expected_results = @info.respond_to?(:expectedResults) ? @info.expectedResults : true - model = Redland::Model.new - ntriples_parser = Redland::Parser.ntriples - ntriples_parser.parse_string_into_model(model, actual.to_ntriples, "http://www.w3.org/2006/07/SWD/RDFa/testsuite/xhtml1-testcases/") - - @results = @query.execute(model) - #puts "Redland query results: #{@results.inspect}" - if @expected_results && @results - @results.is_boolean? && @results.get_boolean? - else - @results.nil? || @results.is_boolean? && !@results.get_boolean? - end - end - def failure_message_for_should - info = @info.respond_to?(:information) ? @info.information : "" - "#{info + "\n" unless info.empty?}" + - if @results.nil? - "Query failed to return results" - elsif !@results.is_boolean? - "Query returned non-boolean results" - elsif @expected_results - "Query returned false" - else - "Query returned true (expected false)" - end + - "\n#{@expected}" + - "\n#{@info.input}" + - "\nResults:\n#{@actual.to_ntriples}" + - "\nDebug:\n#{@info.trace}" - end - end - - def pass_query(expected, info = "") - PassQuery.new(expected, info) - end +def normalize(graph) + case graph + when RDF::Graph then graph + when IO, StringIO + RDF::Graph.new.load(graph, :base_uri => @info.about) else - def pass_query(expect, info = ""); false; end + # Figure out which parser to use + g = RDF::Graph.new + reader_class = detect_format(graph) + reader_class.new(graph, :base_uri => @info.about).each {|s| g << s} + g end +end - class BeValidXML - def initialize(info) - @info = info +Info = Struct.new(:about, :information, :trace, :compare, :inputDocument, :outputDocument) + +RSpec::Matchers.define :be_equivalent_graph do |expected, info| + match do |actual| + @info = if info.respond_to?(:about) + info + elsif info.is_a?(Hash) + identifier = info[:identifier] || expected.is_a?(RDF::Graph) ? expected.context : info[:about] + trace = info[:trace] + trace = trace.join("\n") if trace.is_a?(Array) + Info.new(identifier, info[:information] || "", trace, info[:compare]) + else + Info.new(expected.is_a?(RDF::Graph) ? expected.context : info, info.to_s) end - def matches?(actual) - @actual = actual - @doc = Nokogiri::XML.parse(actual) - @results = @doc.validate - @results.nil? - rescue - false - end - def failure_message_for_should - "#{@info + "\n" unless @info.empty?}" + - if @doc.nil? - "did not parse" - else - "\n#{@results}" + - "\nParsed:\n#{@doc}" - end + - "\nActual:\n#{@actual}" - end + @expected = normalize(expected) + @actual = normalize(actual) + @actual.isomorphic_with?(@expected) end - def be_valid_xml(info = "") - BeValidXML.new(info) - end + failure_message_for_should do |actual| + info = @info.respond_to?(:information) ? @info.information : @info.inspect + if @expected.is_a?(RDF::Graph) && @actual.size != @expected.size + "Graph entry count differs:\nexpected: #{@expected.size}\nactual: #{@actual.size}" + elsif @expected.is_a?(Array) && @actual.size != @expected.length + "Graph entry count differs:\nexpected: #{@expected.length}\nactual: #{@actual.size}" + else + "Graph differs" + end + + "\n#{info + "\n" unless info.empty?}" + + (@info.inputDocument ? "Input file: #{@info.inputDocument}\n" : "") + + (@info.outputDocument ? "Output file: #{@info.outputDocument}\n" : "") + + "Unsorted Expected:\n#{@expected.dump(:ntriples)}" + + "Unsorted Results:\n#{@actual.dump(:ntriples)}" + + (@info.trace ? "\nDebug:\n#{@info.trace}" : "") + end +end - class BeEquivalentXML - def initialize(expected, info) - @expected = expected - @info = info - end - - def matches?(actual) - @actual = actual +RSpec::Matchers.define :pass_query do |expected, info| + match do |actual| + @expected = expected.read + query = SPARQL::Grammar.parse(@expected) + @results = query.execute(actual) - a = @actual.index("<") == 0 ? @actual : "<foo>#{@actual}</foo>" - e = @expected.index("<") == 0 ? @expected : "<foo>#{@expected}</foo>" - a_hash = ActiveSupport::XmlMini.parse(a) - e_hash = ActiveSupport::XmlMini.parse(e) - a_hash == e_hash - rescue - puts $! - @fault = $!.message - false - end - - def failure_message_for_should - "#{@info + "\n" unless @info.empty?}" + - "Fault: #{@fault + "\n" if @fault}" + - "Expected:#{@expected}\n" + - "Actual:#{@actual}" - end + @results.should == info.expectedResults end - def be_equivalent_xml(expected, info = "") - BeEquivalentXML.new(expected, info) - end + failure_message_for_should do |actual| + information = info.respond_to?(:information) ? info.information : "" + "#{information + "\n" unless information.empty?}" + + if @results.nil? + "Query failed to return results" + elsif !@results.is_a?(RDF::Literal::Boolean) + "Query returned non-boolean results" + elsif info.expectedResults + "Query returned false" + else + "Query returned true (expected false)" + end + + "\n#{@expected}" + + "\nResults:\n#{@actual.dump(:ntriples)}" + + "\nDebug:\n#{info.trace}" + end end