# encoding: UTF-8 ASCIIDOCTOR_PROJECT_DIR = File.dirname File.dirname(__FILE__) Dir.chdir ASCIIDOCTOR_PROJECT_DIR if RUBY_VERSION < '1.9' require 'rubygems' end require 'simplecov' if ENV['COVERAGE'] == 'true' require File.join(ASCIIDOCTOR_PROJECT_DIR, 'lib', 'asciidoctor') require 'socket' require 'nokogiri' require 'tmpdir' autoload :FileUtils, 'fileutils' autoload :Pathname, 'pathname' RE_XMLNS_ATTRIBUTE = / xmlns="[^"]+"/ RE_DOCTYPE = /\s* "<" # # Returns the String entity expanded to its equivalent UTF-8 glyph def expand_entity(number) [number].pack('U*') end alias :entity :expand_entity def invoke_cli_with_filenames(argv = [], filenames = [], &block) filepaths = Array.new filenames.each { |filename| if filenames.nil?|| ::Pathname.new(filename).absolute? filepaths.push(filename) else filepaths.push(File.join(File.dirname(__FILE__), 'fixtures', filename)) end } invoker = Asciidoctor::Cli::Invoker.new(argv + filepaths) invoker.invoke!(&block) invoker end def invoke_cli_to_buffer(argv = [], filename = 'sample.asciidoc', &block) invoke_cli(argv, filename, [StringIO.new, StringIO.new], &block) end def invoke_cli(argv = [], filename = 'sample.asciidoc', buffers = nil, &block) if filename.nil? || filename == '-' || ::Pathname.new(filename).absolute? filepath = filename else filepath = File.join(File.dirname(__FILE__), 'fixtures', filename) end invoker = Asciidoctor::Cli::Invoker.new(argv + [filepath]) if buffers invoker.redirect_streams(*buffers) end invoker.invoke!(&block) invoker end def redirect_streams old_stdout, $stdout = $stdout, (tmp_stdout = ::StringIO.new) old_stderr, $stderr = $stderr, (tmp_stderr = ::StringIO.new) begin yield tmp_stdout, tmp_stderr ensure $stdout = old_stdout $stderr = old_stderr end end def resolve_localhost (RUBY_VERSION < '1.9' || RUBY_ENGINE == 'rbx') ? Socket.gethostname : Socket.ip_address_list.find {|addr| addr.ipv4? }.ip_address end def using_test_webserver host = resolve_localhost, port = 9876 server = TCPServer.new host, port base_dir = File.expand_path File.dirname __FILE__ t = Thread.new do while (session = server.accept) request = session.gets resource = nil if (m = /GET (\S+) HTTP\/1\.1$/.match(request.chomp)) resource = (resource = m[1]) == '' ? '.' : resource else session.print %(HTTP/1.1 405 Method Not Allowed\r\nContent-Type: text/plain\r\n\r\n) session.print %(405 - Method not allowed\n) session.close break end if resource == '/name/asciidoctor' session.print %(HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n) session.print %({"name": "asciidoctor"}\n) elsif File.file?(resource_file = (File.join base_dir, resource)) mimetype = if (ext = ::File.extname(resource_file)[1..-1]) ext == 'adoc' ? 'text/plain' : %(image/#{ext}) else 'text/plain' end session.print %(HTTP/1.1 200 OK\r\nContent-Type: #{mimetype}\r\n\r\n) File.open resource_file, 'rb' do |fd| until fd.eof? do buffer = fd.read 256 session.write buffer end end else session.print %(HTTP/1.1 404 File Not Found\r\nContent-Type: text/plain\r\n\r\n) session.print %(404 - Resource not found.\n) end session.close end end begin yield ensure begin server.shutdown # "Errno::ENOTCONN: Socket is not connected' is reported on some platforms; call #close instead of #shutdown rescue Errno::ENOTCONN server.close end t.exit end end end ### # # Context goodness provided by @citrusbyte's contest. # See https://github.com/citrusbyte/contest # ### # Contest adds +teardown+, +test+ and +context+ as class methods, and the # instance methods +setup+ and +teardown+ now iterate on the corresponding # blocks. Note that all setup and teardown blocks must be defined with the # block syntax. Adding setup or teardown instance methods defeats the purpose # of this library. class Minitest::Test def self.setup(&block) define_method :setup do super(&block) instance_eval(&block) end end def self.teardown(&block) define_method :teardown do instance_eval(&block) super(&block) end end def self.context(*name, &block) subclass = Class.new(self) remove_tests(subclass) subclass.class_eval(&block) if block_given? const_set(context_name(name.join(" ")), subclass) end def self.test(name, &block) define_method(test_name(name), &block) end class << self alias_method :should, :test alias_method :describe, :context end private def self.context_name(name) "Test#{sanitize_name(name).gsub(/(^| )(\w)/) { $2.upcase }}".to_sym end def self.test_name(name) "test_#{sanitize_name(name).gsub(/\s+/,'_')}".to_sym end def self.sanitize_name(name) name.gsub(/\W+/, ' ').strip end def self.remove_tests(subclass) subclass.public_instance_methods.grep(/^test_/).each do |meth| subclass.send(:undef_method, meth.to_sym) end end end def context(*name, &block) Minitest::Test.context(name, &block) end