diff options
| author | Seba Gamboa <[email protected]> | 2015-09-23 14:24:03 -0300 |
|---|---|---|
| committer | Seba Gamboa <[email protected]> | 2015-09-23 14:24:03 -0300 |
| commit | aed91b0fb2fe3c2cd3a74e2e5bc23c8bd95ef1db (patch) | |
| tree | 880d0eb2d6ec5d949f4a0ae72980687dd9041740 /spec | |
| parent | 731c5326b47b34364b2a8f69c6d558f52957a562 (diff) | |
| download | yard-mruby-aed91b0fb2fe3c2cd3a74e2e5bc23c8bd95ef1db.tar.gz yard-mruby-aed91b0fb2fe3c2cd3a74e2e5bc23c8bd95ef1db.zip | |
Making specs works
Diffstat (limited to 'spec')
| -rw-r--r-- | spec/handlers/c/mruby_class_handler_spec.rb | 32 | ||||
| -rw-r--r-- | spec/handlers/c/spec_helper.rb | 13 | ||||
| -rw-r--r-- | spec/handlers/spec_helper.rb | 31 | ||||
| -rw-r--r-- | spec/spec_helper.rb | 93 | ||||
| -rw-r--r-- | spec/yard/mruby_spec.rb | 11 |
5 files changed, 169 insertions, 11 deletions
diff --git a/spec/handlers/c/mruby_class_handler_spec.rb b/spec/handlers/c/mruby_class_handler_spec.rb new file mode 100644 index 0000000..521ad62 --- /dev/null +++ b/spec/handlers/c/mruby_class_handler_spec.rb @@ -0,0 +1,32 @@ +require_relative 'spec_helper' + +describe YARD::Handlers::C::MRubyClassHandler do + it "should register classes" do + parse_init 'cFoo = mrb_define_class(mrb, "Foo", mrb->object_class);' + + expect(Registry.at('Foo').type).to be :class + end + + it "should register classes under namespaces" do + parse_init 'cFoo = mrb_define_class_under(mrb, cBar, "Foo", rb_cObject);' + expect(Registry.at('Bar::Foo').type).to be :class + end + + it "should remember symbol defined with class" do + parse_init(<<-eof) + cXYZ = mrb_define_class(mrb, "Foo", mrb->object_class); + mrb_define_method(mrb, cXYZ, "bar", bar, MRB_ARGS_NONE()); + eof + expect(Registry.at('Foo').type).to be :class + expect(Registry.at('Foo#bar')).not_to be_nil + end + + it "should lookup superclass symbol name" do + parse_init(<<-eof) + cXYZ = mrb_define_class(mrb,"Foo", mrb->object_class); + cBar = mrb_define_class(mrb,"Bar", cXYZ); + eof + expect(Registry.at('Bar').superclass).to eq Registry.at('Foo') + end + +end diff --git a/spec/handlers/c/spec_helper.rb b/spec/handlers/c/spec_helper.rb new file mode 100644 index 0000000..9424e3e --- /dev/null +++ b/spec/handlers/c/spec_helper.rb @@ -0,0 +1,13 @@ +require_relative '../spec_helper' + +def parse(src, file = '(stdin)') + YARD::Registry.clear + parser = YARD::Parser::SourceParser.new(:c) + parser.file = file + parser.parse(StringIO.new(src)) +end + +def parse_init(src) + YARD::Registry.clear + YARD.parse_string("void mrb_foo_gem_init(mrb_state *mrb) {\n#{src}\n}", :c) +end diff --git a/spec/handlers/spec_helper.rb b/spec/handlers/spec_helper.rb new file mode 100644 index 0000000..1eba194 --- /dev/null +++ b/spec/handlers/spec_helper.rb @@ -0,0 +1,31 @@ +require_relative '../spec_helper' +require 'stringio' + +def undoc_error(code) + lambda { StubbedSourceParser.parse_string(code) }.should raise_error(Parser::UndocumentableError) +end + +def with_parser(parser_type, &block) + tmp = StubbedSourceParser.parser_type + StubbedSourceParser.parser_type = parser_type + yield + StubbedSourceParser.parser_type = tmp +end + +class StubbedProcessor < YARD::Handlers::Processor + def process(statements) + statements.each_with_index do |stmt, index| + find_handlers(stmt).each do |handler| + handler.new(self, stmt).process + end + end + end +end + +class StubbedSourceParser < YARD::Parser::SourceParser + StubbedSourceParser.parser_type = :ruby + def post_process + post = StubbedProcessor.new(self) + post.process(@parser.enumerator) + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 9a01ce9..dab8698 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,2 +1,95 @@ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) + +require 'yard' require 'yard/mruby' + +def parse_file(file, thisfile = __FILE__, log_level = log.level, ext = '.rb.txt') + Registry.clear + path = File.join(File.dirname(thisfile), 'examples', file.to_s + ext) + YARD::Parser::SourceParser.parse(path, [], log_level) +end + +def described_in_docs(klass, meth, file = nil) + YARD::Tags::Library.define_tag "RSpec Specification", :it, :with_raw_title_and_text + + # Parse the file (could be multiple files) + if file + filename = File.join(YARD::ROOT, file) + YARD::Parser::SourceParser.new.parse(filename) + else + underscore = klass.class_name.gsub(/([a-z])([A-Z])/, '\1_\2').downcase.gsub('::', '/') + $".find_all {|p| p.include? underscore }.each do |filename| + next unless File.exist? filename + YARD::Parser::SourceParser.new.parse(filename) + end + end + + # Get the object + objname = klass.name + (meth[0,1] == '#' ? meth : '::' + meth) + obj = Registry.at(objname) + raise "Cannot find object #{objname} described by spec." unless obj + raise "#{obj.path} has no @it tags to spec." unless obj.has_tag? :it + + # Run examples + describe(klass, meth) do + obj.tags(:it).each do |it| + path = File.relative_path(YARD::ROOT, obj.file) + it(it.name + " (from #{path}:#{obj.line})") do + begin + eval(it.text) + rescue => e + e.set_backtrace(["#{path}:#{obj.line}:in @it tag specification"]) + raise e + end + end + end + end +end + +def docspec(objname = self.class.description, klass = self.class.described_type) + # Parse the file (could be multiple files) + underscore = klass.class_name.gsub(/([a-z])([A-Z])/, '\1_\2').downcase.gsub('::', '/') + $".find_all {|p| p.include? underscore }.each do |filename| + filename = File.join(YARD::ROOT, filename) + next unless File.exist? filename + YARD::Parser::SourceParser.new.parse(filename) + end + + # Get the object + objname = klass.name + objname if objname =~ /^[^A-Z]/ + obj = Registry.at(objname) + raise "Cannot find object #{objname} described by spec." unless obj + raise "#{obj.path} has no @example tags to spec." unless obj.has_tag? :example + + # Run examples + obj.tags(:example).each do |exs| + exs.text.split(/\n/).each do |ex| + begin + hash = eval("{ #{ex} }") + hash.keys.first.should == hash.values.first + rescue => e + raise e, "#{e.message}\nInvalid spec example in #{objname}:\n\n\t#{ex}\n" + end + end + end +end + +module Kernel + require 'cgi' + + def p(*args) + puts args.map {|arg| CGI.escapeHTML(arg.inspect) }.join("<br/>\n") + args.first + end + + def puts(str = '') + STDOUT.puts str + "<br/>\n" + str + end +end if ENV['TM_APP_PATH'] + +RSpec.configure do |config| + config.before(:each) { log.io = StringIO.new } +end + +Registry = YARD::Registry diff --git a/spec/yard/mruby_spec.rb b/spec/yard/mruby_spec.rb deleted file mode 100644 index 3b6f756..0000000 --- a/spec/yard/mruby_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'spec_helper' - -describe Yard::Mruby do - it 'has a version number' do - expect(Yard::Mruby::VERSION).not_to be nil - end - - it 'does something useful' do - expect(false).to eq(true) - end -end |
