lib_dir = File.dirname(__FILE__) + '/../lib' require 'minitest/autorun' require 'fileutils' $:.unshift lib_dir unless $:.include?(lib_dir) require 'sass' require 'mathn' if ENV['MATHN'] == 'true' Sass::RAILS_LOADED = true unless defined?(Sass::RAILS_LOADED) Sass.tests_running = true if defined?(Encoding) $-w, w = false, $-w Encoding.default_external = 'UTF-8' $-w = w end module Sass::Script::Functions def option(name) Sass::Script::Value::String.new(@options[name.value.to_sym].to_s) end end class MiniTest::Test def munge_filename(opts = {}) opts[:filename] ||= filename_for_test(opts[:syntax] || :sass) opts[:sourcemap_filename] ||= sourcemap_filename_for_test opts end def test_name caller. map {|c| Sass::Util.caller_info(c)[2]}. compact. map {|c| c.sub(/^(block|rescue) in /, '')}. find {|c| c =~ /^test_/} end def filename_for_test(syntax = :sass) "#{test_name}_inline.#{syntax}" end def sourcemap_filename_for_test(syntax = :sass) "#{test_name}_inline.css.map" end def clean_up_sassc path = File.dirname(__FILE__) + "/../.sass-cache" Sass::Util.retry_on_windows {FileUtils.rm_r(path) if File.exist?(path)} end def assert_warning(message) the_real_stderr, $stderr = $stderr, StringIO.new result = yield if message.is_a?(Regexp) assert_match message, $stderr.string.strip else assert_equal message.strip, $stderr.string.strip end result ensure $stderr = the_real_stderr end def assert_no_warning the_real_stderr, $stderr = $stderr, StringIO.new result = yield assert_equal '', $stderr.string result ensure $stderr = the_real_stderr end def silence_warnings(&block) Sass::Util.silence_warnings(&block) end def assert_raise_message(klass, message) yield rescue Exception => e assert_instance_of(klass, e) assert_equal(message, e.message) else flunk "Expected exception #{klass}, none raised" end def assert_raise_line(line) yield rescue Sass::SyntaxError => e assert_equal(line, e.sass_line) else flunk "Expected exception on line #{line}, none raised" end def assert_sass_to_sass(sass, options: {}) assert_equal(sass.rstrip, to_sass(sass, options).rstrip, "Expected Sass to transform to itself") end def assert_scss_to_sass(sass, scss, options: {}) assert_equal(sass.rstrip, to_sass(scss, options.merge(:syntax => :scss)).rstrip, "Expected SCSS to transform to Sass") end def assert_scss_to_scss(scss, source: scss, options: {}) assert_equal(scss.rstrip, to_scss(source, options.merge(:syntax => :scss)).rstrip, "Expected SCSS to transform to #{scss == source ? 'itself' : 'SCSS'}") end def assert_sass_to_scss(scss, sass, options: {}) assert_equal(scss.rstrip, to_scss(sass, options).rstrip, "Expected Sass to transform to SCSS") end def assert_converts(sass, scss, options: {}) assert_sass_to_sass(sass, options: options) assert_scss_to_sass(sass, scss, options: options) assert_scss_to_scss(scss, options: options) assert_sass_to_scss(scss, sass, options: options) end def to_sass(scss, options = {}) Sass::Util.silence_sass_warnings do Sass::Engine.new(scss, options).to_tree.to_sass(options) end end def to_scss(sass, options = {}) Sass::Util.silence_sass_warnings do Sass::Engine.new(sass, options).to_tree.to_scss(options) end end end module PublicApiLinter def lint_api(api_class, duck_type_class) define_method :test_lint_instance do assert lint_instance.is_a?(duck_type_class) end api_class.instance_methods.each do |meth| define_method :"test_has_#{meth}" do assert lint_instance.respond_to?(meth), "#{duck_type_class.name} does not implement #{meth}" end end end end