earl-report 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,7 +3,7 @@ $:.unshift "."
3
3
  require 'spec_helper'
4
4
 
5
5
  describe EarlReport do
6
- subject {
6
+ let!(:earl) {
7
7
  EarlReport.new(
8
8
  File.expand_path("../test-files/report-complete.ttl", __FILE__),
9
9
  :bibRef => "[[TURTLE]]",
@@ -11,6 +11,7 @@ describe EarlReport do
11
11
  :verbose => false,
12
12
  :manifest => File.expand_path("../test-files/manifest.ttl", __FILE__))
13
13
  }
14
+ subject {earl}
14
15
 
15
16
  describe ".new" do
16
17
  let(:manifest) {
@@ -33,7 +34,7 @@ describe EarlReport do
33
34
  }
34
35
 
35
36
  it "requires a :manifest option" do
36
- lambda {EarlReport.new}.should raise_error("Test Manifest must be specified with :manifest option")
37
+ lambda {EarlReport.new}.should raise_error("Test Manifests must be specified with :manifest option")
37
38
  end
38
39
 
39
40
  context "with base" do
@@ -162,28 +163,25 @@ describe EarlReport do
162
163
  end
163
164
 
164
165
  describe "#json_hash" do
165
- let(:json) {
166
- subject.send(:json_hash)
167
- }
168
- specify {json.should be_a(Hash)}
166
+ let(:json) {earl.send(:json_hash)}
167
+ subject {json}
168
+ it {should be_a(Hash)}
169
169
  {
170
170
  "@id" => "",
171
- "@type" => "earl:Report",
171
+ "@type" => ["earl:Software", "doap:Project"],
172
172
  'bibRef' => "[[TURTLE]]",
173
- 'title' => "Turtle Test Results"
173
+ 'name' => "Turtle Test Results"
174
174
  }.each do |prop, value|
175
- specify(prop) {json[prop].should == value}
175
+ specify(prop) {subject[prop].should == value}
176
176
  end
177
177
 
178
- %w(assertions generatedBy testSubjects tests).each do |key|
179
- specify {json.keys.should include(key)}
178
+ %w(assertions generatedBy testSubjects entries).each do |key|
179
+ its(:keys) {should include(key)}
180
180
  end
181
181
 
182
182
  context "parsing to RDF" do
183
- let(:graph) do
184
- @graph ||= begin
185
- RDF::Graph.new << JSON::LD::Reader.new(json.to_json, :base_uri => "http://example.com/report")
186
- end
183
+ let!(:graph) do
184
+ RDF::Graph.new << JSON::LD::Reader.new(subject.to_json, :base_uri => "http://example.com/report")
187
185
  end
188
186
 
189
187
  it "has Report" do
@@ -209,9 +207,10 @@ describe EarlReport do
209
207
  end
210
208
 
211
209
  describe "#json_test_subject_info" do
212
- let(:json) {subject.send(:json_test_subject_info)}
213
- specify {json.should be_a(Array)}
214
- specify("have length 1") {json.length.should == 1}
210
+ let(:json) {earl.send(:json_test_subject_info)}
211
+ subject {json}
212
+ it {should be_a(Array)}
213
+ its(:length) {should == 1}
215
214
 
216
215
  context "test subject" do
217
216
  let(:ts) {json.first}
@@ -240,51 +239,67 @@ describe EarlReport do
240
239
  end
241
240
  end
242
241
  end
243
-
242
+
244
243
  describe "#json_result_info" do
245
- let(:json) {subject.send(:json_result_info)}
246
- specify {json.should be_a(Array)}
247
- specify("have 2 entries") {json.length.should == 2}
244
+ let(:json) {earl.send(:json_result_info)}
245
+ subject {json}
246
+ it {should be_a(Array)}
247
+ its(:length) {should == 1}
248
248
 
249
- context "test case" do
250
- let(:tc) {json.first}
249
+ context 'entries' do
250
+ let(:ts) {json.first}
251
251
  {
252
- "@id" => "http://example/manifest.ttl#testeval00",
253
- "@type" => %w(earl:TestCriterion earl:TestCase),
254
- title: "subm-test-00",
255
- description: "Blank subject",
256
- testAction: "http://example/test-00.ttl",
257
- testResult: "http://example/test-00.out",
252
+ "@id" => "http://example/manifest.ttl",
253
+ "@type" => %w(earl:Report mf:Manifest),
254
+ title: "Example Test Cases"
258
255
  }.each do |prop, value|
259
- specify(prop) {tc[prop.to_s].should == value}
256
+ specify(prop) {ts[prop.to_s].should == value}
260
257
  end
261
258
 
262
- context('assertions') do
263
- specify { tc['assertions'].should be_a(Array)}
264
- specify('has one entry') { tc['assertions'].length.should == 1}
259
+ it "should have two entries" do
260
+ ts['entries'].length.should == 2
265
261
  end
266
262
 
267
- context "assertion" do
268
- let(:as) {tc['assertions'].first}
269
- specify {as.should be_a(Hash)}
263
+ context "test case" do
264
+ let(:tc) {ts['entries'].first}
270
265
  {
271
- "@type" => %(earl:Assertion),
272
- assertedBy: "http://greggkellogg.net/foaf#me",
273
- mode: "earl:automatic",
274
- subject: "http://rubygems.org/gems/rdf-turtle",
275
- test: "http://example/manifest.ttl#testeval00",
266
+ "@id" => "http://example/manifest.ttl#testeval00",
267
+ "@type" => %w(earl:TestCriterion earl:TestCase http://www.w3.org/ns/rdftest#TestTurtleEval),
268
+ title: "subm-test-00",
269
+ description: "Blank subject",
270
+ testAction: "http://example/test-00.ttl",
271
+ testResult: "http://example/test-00.out",
276
272
  }.each do |prop, value|
277
- specify(prop) {as[prop.to_s].should == value}
273
+ specify(prop) {tc[prop.to_s].should == value}
274
+ end
275
+
276
+ context('assertions') do
277
+ specify { tc['assertions'].should be_a(Array)}
278
+ specify('has one entry') { tc['assertions'].length.should == 1}
278
279
  end
279
280
 
280
- context "result" do
281
- let(:rs) {as['result']}
282
- specify {rs.should be_a(Hash)}
281
+ context "assertion" do
282
+ let(:as) {tc['assertions'].first}
283
+ specify {as.should be_a(Hash)}
283
284
  {
284
- "@type" => %(earl:TestResult),
285
- outcome: "earl:passed",
285
+ "@type" => %(earl:Assertion),
286
+ assertedBy: "http://greggkellogg.net/foaf#me",
287
+ mode: "earl:automatic",
288
+ subject: "http://rubygems.org/gems/rdf-turtle",
289
+ test: "http://example/manifest.ttl#testeval00",
286
290
  }.each do |prop, value|
287
- specify(prop) {rs[prop.to_s].should == value}
291
+ specify(prop) {as[prop.to_s].should == value}
292
+ end
293
+
294
+ context "result" do
295
+ let(:rs) {as['result']}
296
+ specify {rs.should be_a(Hash)}
297
+ {
298
+ "@type" => %(earl:TestResult),
299
+ outcome: "earl:passed",
300
+ }.each do |prop, value|
301
+ specify(prop) {rs[prop.to_s].should == value}
302
+ end
288
303
  end
289
304
  end
290
305
  end
@@ -292,176 +307,152 @@ describe EarlReport do
292
307
  end
293
308
 
294
309
  describe "#test_subject_turtle" do
295
- context "test subject" do
296
- let(:desc) {{
297
- "@id" => "http://rubygems.org/gems/rdf-turtle",
298
- "@type" => %w(earl:TestSubject doap:Project),
299
- 'doapDesc' => "RDF::Turtle is an Turtle reader/writer for the RDF.rb library suite.",
300
- 'homepage' => "http://ruby-rdf.github.com/rdf-turtle",
301
- 'language' => "Ruby",
302
- 'name' => "RDF::Turtle",
303
- 'developer' => {
304
- '@id' => "http://greggkellogg.net/foaf#me",
305
- '@type' => %w(foaf:Person earl:Assertor),
306
- 'foaf:name' => "Gregg Kellogg"
307
- }
308
- }}
309
- let(:ttl) {subject.send(:test_subject_turtle, desc)}
310
- specify {ttl.length.should > 0}
311
- it "has subject subject" do
312
- ttl.should match(/<#{desc['@id']}> a/)
313
- end
314
- it "has types" do
315
- ttl.should match(/ a #{desc['@type'].join(', ')}\s*[;\.]$/)
316
- end
317
- it "has name" do
318
- ttl.should match(/ doap:name "#{desc['name']}"\s*[;\.]$/)
319
- end
320
- it "has description" do
321
- ttl.should match(/ doap:description """#{desc['doapDesc']}"""@en\s*[;\.]$/)
322
- end
323
- it "has doap:programming-language" do
324
- ttl.should match(/ doap:programming-language "#{desc['language']}"\s*[;\.]$/)
325
- end
326
- it "has doap:developer" do
327
- ttl.should match(/ doap:developer <#{desc['developer']['@id']}>/)
328
- end
329
-
330
- context "developer" do
331
- let(:dev) {desc['developer']}
332
- it "has subject subject" do
333
- ttl.should match(/<#{dev['@id']}> a/)
334
- end
335
- it "has types" do
336
- ttl.should match(/ a #{dev['@type'].join(', ')}\s*[;\.]$/)
337
- end
338
- it "has name" do
339
- ttl.should match(/ foaf:name "#{dev['foaf:name']}"\s*[;\.]$/)
340
- end
341
- end
310
+ let(:desc) {{
311
+ "@id" => "http://rubygems.org/gems/rdf-turtle",
312
+ "@type" => %w(earl:TestSubject doap:Project),
313
+ 'doapDesc' => "RDF::Turtle is an Turtle reader/writer for the RDF.rb library suite.",
314
+ 'homepage' => "http://ruby-rdf.github.com/rdf-turtle",
315
+ 'language' => "Ruby",
316
+ 'name' => "RDF::Turtle",
317
+ 'developer' => {
318
+ '@id' => "http://greggkellogg.net/foaf#me",
319
+ '@type' => %w(foaf:Person earl:Assertor),
320
+ 'foaf:name' => "Gregg Kellogg"
321
+ }
322
+ }}
323
+ let(:ttl) {earl.send(:test_subject_turtle, desc)}
324
+ subject {ttl}
325
+
326
+ its(:length) {should > 0}
327
+ specify {should match(/<#{desc['@id']}> a/)}
328
+ specify {should match(/ a #{desc['@type'].join(', ')}\s*[;\.]$/)}
329
+ specify {should match(/ doap:name "#{desc['name']}"\s*[;\.]$/)}
330
+ specify {should match(/ doap:description """#{desc['doapDesc']}"""@en\s*[;\.]$/)}
331
+ specify {should match(/ doap:programming-language "#{desc['language']}"\s*[;\.]$/)}
332
+ specify {should match(/ doap:developer <#{desc['developer']['@id']}>/)}
333
+
334
+ context "developer" do
335
+ let(:dev) {desc['developer']}
336
+ specify {should match(/<#{dev['@id']}> a/)}
337
+ specify {should match(/ a #{dev['@type'].join(', ')}\s*[;\.]$/)}
338
+ specify {should match(/ foaf:name "#{dev['foaf:name']}"\s*[;\.]$/)}
342
339
  end
343
340
  end
344
341
 
345
342
  describe "#tc_turtle" do
346
- context "test case" do
347
- let(:tc) {{
348
- "@id" => "http://example/manifest.ttl#testeval00",
349
- "@type" => %w(earl:TestCriterion earl:TestCase),
350
- 'title' => "subm-test-00",
351
- 'description' => "Blank subject",
352
- 'testAction' => "http://example/test-00.ttl",
353
- 'testResult' => "http://example/test-00.out",
354
- 'assertions' => [{
355
- "@type" => %(earl:Assertion),
356
- 'assertedBy' =>"http://greggkellogg.net/foaf#me",
357
- 'mode' => "earl:automatic",
358
- 'subject' => "http://rubygems.org/gems/rdf-turtle",
359
- 'test' => "http://example/manifest.ttl#testeval00",
360
- 'result' => {
361
- "@type" => %(earl:TestResult),
362
- 'outcome' => "earl:passed",
363
- }
364
- }]
365
- }}
366
- let(:ttl) {subject.send(:tc_turtle, tc)}
367
- specify {ttl.length.should > 0}
368
- it "has subject subject" do
369
- ttl.should match(/<#{tc['@id']}> a/)
370
- end
371
- it "has types" do
372
- ttl.should match(/ a #{tc['@type'].join(', ')}\s*[;\.]$/)
373
- end
374
- it "has dc:title" do
375
- ttl.should match(/ dc:title "#{tc['title']}"\s*[;\.]$/)
376
- end
377
- it "has dc:description" do
378
- ttl.should match(/ dc:description """#{tc['description']}"""@en\s*[;\.]$/)
379
- end
380
- it "has mf:action" do
381
- ttl.should match(/ mf:action <#{tc['testAction']}>\s*[;\.]$/)
382
- end
383
- it "has mf:result" do
384
- ttl.should match(/ mf:result <#{tc['testResult']}>\s*[;\.]$/)
385
- end
386
- it "has earl:assertions" do
387
- ttl.should match(/ earl:assertions \(\s*\[ a earl:Assertion/m)
388
- end
389
- end
390
- end
391
-
392
- describe "#as_turtle" do
393
- context "assertion" do
394
- let(:as) {{
395
- "@type" => %w(earl:Assertion),
396
- 'assertedBy' => "http://greggkellogg.net/foaf#me",
343
+ let(:tc) {{
344
+ "@id" => "http://example/manifest.ttl#testeval00",
345
+ "@type" => %w(earl:TestCriterion earl:TestCase),
346
+ 'title' => "subm-test-00",
347
+ 'description' => "Blank subject",
348
+ 'testAction' => "http://example/test-00.ttl",
349
+ 'testResult' => "http://example/test-00.out",
350
+ 'assertions' => [{
351
+ "@type" => %(earl:Assertion),
352
+ 'assertedBy' =>"http://greggkellogg.net/foaf#me",
397
353
  'mode' => "earl:automatic",
398
354
  'subject' => "http://rubygems.org/gems/rdf-turtle",
399
355
  'test' => "http://example/manifest.ttl#testeval00",
400
356
  'result' => {
401
- '@type' => 'earl:TestResult',
402
- 'outcome' => 'earl:passed'
357
+ "@type" => %(earl:TestResult),
358
+ 'outcome' => "earl:passed",
403
359
  }
404
- }}
405
- let(:ttl) {subject.send(:as_turtle, as)}
406
- specify {ttl.length.should > 0}
407
- it "has type" do
408
- ttl.should match(/ a #{as['@type'].join(', ')}\s*[;\.]$/)
409
- end
410
- it "has earl:assertedBy" do
411
- ttl.should match(/ earl:assertedBy <#{as['assertedBy']}>\s*[;\.]$/)
412
- end
413
- it "has earl:test" do
414
- ttl.should match(/ earl:test <#{as['test']}>\s*[;\.]$/)
415
- end
416
- it "has earl:subject" do
417
- ttl.should match(/ earl:subject <#{as['subject']}>\s*[;\.]$/)
418
- end
419
- it "has earl:mode" do
420
- ttl.should match(/ earl:mode #{as['mode']}\s*[;\.]$/)
421
- end
422
- it "has earl:result" do
423
- ttl.should match(/ earl:result \[ a #{as['result']['@type']}; earl:outcome #{as['result']['outcome']} \]\]/)
424
- end
360
+ }]
361
+ }}
362
+ let(:ttl) {earl.send(:tc_turtle, tc)}
363
+ subject {ttl}
364
+ its(:length) {should > 0}
365
+ specify {should match(/<#{tc['@id']}> a/)}
366
+ specify {should match(/ a #{tc['@type'].join(', ')}\s*[;\.]$/)}
367
+ specify {should match(/ dc:title "#{tc['title']}"\s*[;\.]$/)}
368
+ specify {should match(/ dc:description """#{tc['description']}"""@en\s*[;\.]$/)}
369
+ specify {should match(/ mf:action <#{tc['testAction']}>\s*[;\.]$/)}
370
+ specify {should match(/ mf:result <#{tc['testResult']}>\s*[;\.]$/)}
371
+ specify {should match(/ earl:assertions \(\s*\[ a earl:Assertion/m)}
372
+ end
373
+
374
+ describe "#as_turtle" do
375
+ let(:as) {{
376
+ "@type" => %w(earl:Assertion),
377
+ 'assertedBy' => "http://greggkellogg.net/foaf#me",
378
+ 'mode' => "earl:automatic",
379
+ 'subject' => "http://rubygems.org/gems/rdf-turtle",
380
+ 'test' => "http://example/manifest.ttl#testeval00",
381
+ 'result' => {
382
+ '@type' => 'earl:TestResult',
383
+ 'outcome' => 'earl:passed'
384
+ }
385
+ }}
386
+ let(:ttl) {earl.send(:as_turtle, as)}
387
+ subject {ttl}
388
+ its(:length) {should > 0}
389
+ specify {should match(/ a #{as['@type'].join(', ')}\s*[;\.]$/)}
390
+ specify {should match(/ earl:assertedBy <#{as['assertedBy']}>\s*[;\.]$/)}
391
+ specify {should match(/ earl:test <#{as['test']}>\s*[;\.]$/)}
392
+ specify {should match(/ earl:subject <#{as['subject']}>\s*[;\.]$/)}
393
+ specify {should match(/ earl:mode #{as['mode']}\s*[;\.]$/)}
394
+ specify {should match(/ earl:result \[ a #{as['result']['@type']}; earl:outcome #{as['result']['outcome']} \]\]/)}
395
+ it "has type" do
396
+ ttl.should match(/ a #{as['@type'].join(', ')}\s*[;\.]$/)
397
+ end
398
+ it "has earl:assertedBy" do
399
+ ttl.should match(/ earl:assertedBy <#{as['assertedBy']}>\s*[;\.]$/)
400
+ end
401
+ it "has earl:test" do
402
+ ttl.should match(/ earl:test <#{as['test']}>\s*[;\.]$/)
403
+ end
404
+ it "has earl:subject" do
405
+ ttl.should match(/ earl:subject <#{as['subject']}>\s*[;\.]$/)
406
+ end
407
+ it "has earl:mode" do
408
+ ttl.should match(/ earl:mode #{as['mode']}\s*[;\.]$/)
409
+ end
410
+ it "has earl:result" do
411
+ ttl.should match(/ earl:result \[ a #{as['result']['@type']}; earl:outcome #{as['result']['outcome']} \]\]/)
425
412
  end
426
413
  end
427
414
 
428
415
  describe "#earl_turtle" do
429
- let(:json_hash) {subject.send(:json_hash)}
416
+ let(:json_hash) {earl.send(:json_hash)}
430
417
  let(:output) {
431
418
  @output ||= begin
432
419
  sio = StringIO.new
433
- subject.send(:earl_turtle, {io: sio})
420
+ earl.send(:earl_turtle, {io: sio})
434
421
  sio.rewind
435
422
  sio.read
436
423
  end
437
424
  }
425
+ subject {output}
438
426
  let(:ts) {json_hash['testSubjects'].first}
439
- let(:tc) {json_hash['tests'].first}
427
+ let(:tm) {json_hash['entries'].first}
428
+ let(:tc) {tm['entries'].first}
440
429
  let(:as) {tc['assertions'].first}
441
430
 
442
431
  context "prefixes" do
443
432
  %w(dc doap earl foaf mf owl rdf rdfs xsd).each do |pfx|
444
- it "should have prefix #{pfx}" do
445
- output.should match(/@prefix #{pfx}: </)
446
- end
433
+ specify {should match(/@prefix #{pfx}: </)}
447
434
  end
448
435
  end
449
436
 
450
437
  context "earl:Software" do
451
- specify {output.should match(/<> a earl:Report\s*[;\.]$/)}
452
- specify {output.should match(/ dc:title "#{json_hash['title']}"\s*[;\.]$/)}
438
+ specify {should match(/<> a earl:Software, doap:Project\s*[;\.]$/)}
439
+ specify {should match(/ doap:name "#{json_hash['name']}"\s*[;\.]$/)}
453
440
  end
454
441
 
455
442
  context "Subject Definitions" do
456
- specify {output.should match(/<#{ts['@id']}> a #{ts['@type'].join(', ')}\s*[;\.]$/)}
443
+ specify {should match(/<#{ts['@id']}> a #{ts['@type'].join(', ')}\s*[;\.]$/)}
444
+ end
445
+
446
+ context "Manifest Definitions" do
447
+ specify {should match(/<#{tm['@id']}> a #{tm['@type'].join(', ')}\s*[;\.]$/)}
457
448
  end
458
449
 
459
450
  context "Test Case Definitions" do
460
- specify {output.should match(/<#{tc['@id']}> a #{tc['@type'].join(', ')}\s*[;\.]$/)}
451
+ specify {should match(/<#{tc['@id']}> a #{tc['@type'].join(', ')}\s*[;\.]$/)}
461
452
  end
462
453
 
463
454
  context "Assertion" do
464
- specify {output.should match(/\[ a #{as['@type']}\s*[;\.]$/)}
455
+ specify {should match(/\[ a #{as['@type']}\s*[;\.]$/)}
465
456
  end
466
457
 
467
458
  context "parsing to RDF" do
@@ -533,15 +524,19 @@ describe EarlReport do
533
524
  PREFIX dc: <http://purl.org/dc/terms/>
534
525
  PREFIX doap: <http://usefulinc.com/ns/doap#>
535
526
  PREFIX earl: <http://www.w3.org/ns/earl#>
536
-
527
+ PREFIX mf: <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#>
528
+
537
529
  ASK WHERE {
538
- ?uri a earl:Report;
539
- dc:title "Turtle Test Results";
530
+ ?uri a earl:Software, doap:Project;
531
+ doap:name "Turtle Test Results";
540
532
  dc:bibliographicCitation "[[TURTLE]]";
541
533
  earl:generatedBy ?generatedBy;
542
534
  earl:assertions ?assertionFile;
543
535
  earl:testSubjects (<http://rubygems.org/gems/rdf-turtle>);
544
- earl:tests (
536
+ mf:entries (<http://example/manifest.ttl>) .
537
+
538
+ <http://example/manifest.ttl> a earl:Report, mf:Manifest;
539
+ mf:entries (
545
540
  <http://example/manifest.ttl#testeval00>
546
541
  ?test01
547
542
  ) .
@@ -578,7 +573,7 @@ describe EarlReport do
578
573
 
579
574
  ASK WHERE {
580
575
  <http://example/manifest.ttl#testeval00> a earl:TestCriterion, earl:TestCase;
581
- dc:title "subm-test-00";
576
+ #dc:title "subm-test-00";
582
577
  dc:description """Blank subject"""@en;
583
578
  mf:action <http://example/test-00.ttl>;
584
579
  mf:result <http://example/test-00.out>;