From b9234e50d0910272a508f8ae82733526d541ced8 Mon Sep 17 00:00:00 2001 From: Scott Davis Date: Sun, 12 Jun 2011 02:21:43 -0400 Subject: [PATCH] added test for sprite command and removed specs --- lib/compass/commands/sprite.rb | 2 +- spec/compass/commands/sprite_spec.rb | 55 -- .../sass_extensions/sprites/base_spec.rb | 57 -- .../sass_extensions/sprites/image_spec.rb | 161 ----- .../sprites/sprite_map_spec.rb | 54 -- .../sass_extensions/sprites/sprites_spec.rb | 5 - spec/spec_helper.rb | 37 -- spec/sprites_spec.rb | 571 ------------------ .../public/images/ko/default_background.png | Bin 3113 -> 0 bytes .../public/images/ko/starbg26x27.png | Bin 1079 -> 0 bytes .../public/images/prefix/20-by-20.png | Bin 2799 -> 0 bytes .../public/images/prefix/ten-by-ten.png | Bin 2804 -> 0 bytes .../public/images/selectors/ten-by-ten.png | Bin 2804 -> 0 bytes .../images/selectors/ten-by-ten_active.png | Bin 2804 -> 0 bytes .../images/selectors/ten-by-ten_hover.png | Bin 2804 -> 0 bytes .../images/selectors/ten-by-ten_target.png | Bin 2804 -> 0 bytes .../public/images/squares/ten-by-ten.png | Bin 2804 -> 0 bytes .../images/squares/twenty-by-twenty.png | Bin 2799 -> 0 bytes 18 files changed, 1 insertion(+), 941 deletions(-) delete mode 100644 spec/compass/commands/sprite_spec.rb delete mode 100644 spec/compass/sass_extensions/sprites/base_spec.rb delete mode 100644 spec/compass/sass_extensions/sprites/image_spec.rb delete mode 100644 spec/compass/sass_extensions/sprites/sprite_map_spec.rb delete mode 100644 spec/compass/sass_extensions/sprites/sprites_spec.rb delete mode 100644 spec/spec_helper.rb delete mode 100644 spec/sprites_spec.rb delete mode 100644 spec/test_project/public/images/ko/default_background.png delete mode 100755 spec/test_project/public/images/ko/starbg26x27.png delete mode 100644 spec/test_project/public/images/prefix/20-by-20.png delete mode 100644 spec/test_project/public/images/prefix/ten-by-ten.png delete mode 100644 spec/test_project/public/images/selectors/ten-by-ten.png delete mode 100644 spec/test_project/public/images/selectors/ten-by-ten_active.png delete mode 100644 spec/test_project/public/images/selectors/ten-by-ten_hover.png delete mode 100644 spec/test_project/public/images/selectors/ten-by-ten_target.png delete mode 100644 spec/test_project/public/images/squares/ten-by-ten.png delete mode 100644 spec/test_project/public/images/squares/twenty-by-twenty.png diff --git a/lib/compass/commands/sprite.rb b/lib/compass/commands/sprite.rb index b1c8bee9d0..b93705ed57 100644 --- a/lib/compass/commands/sprite.rb +++ b/lib/compass/commands/sprite.rb @@ -39,7 +39,7 @@ def initialize(working_path, options) def perform relative_uri = options[:uri].gsub(/^#{Compass.configuration.images_dir}\//, '') - sprites = Compass::SpriteImporter.new(relative_uri, Compass.sass_engine_options) + sprites = Compass::SpriteImporter.new(:uri => relative_uri, :options => Compass.sass_engine_options) options[:output_file] ||= File.join(Compass.configuration.sass_path, "sprites", "_#{sprites.name}.#{Compass.configuration.preferred_syntax}") options[:skip_overrides] ||= false contents = sprites.content_for_images(options[:skip_overrides]) diff --git a/spec/compass/commands/sprite_spec.rb b/spec/compass/commands/sprite_spec.rb deleted file mode 100644 index 6980dcc557..0000000000 --- a/spec/compass/commands/sprite_spec.rb +++ /dev/null @@ -1,55 +0,0 @@ -require 'spec_helper' -require 'compass/commands' -require 'compass/exec' -require 'compass/commands/sprite' -describe Compass::Commands::Sprite do - def config_data - return <<-CONFIG - images_path = #{@images_tmp_path.inspect} - CONFIG - end - - def create_temp_cli_dir - directory = File.join(File.expand_path('../', __FILE__), 'test') - ::FileUtils.mkdir_p directory - @test_dir = directory - end - - def run_compass_with_options(options) - output = 'foo' - ::Dir.chdir @test_dir - %x{compass #{options.join(' ')}} - end - - def options_to_cli(options) - options.map.flatten! - end - - let(:test_dir) { @test_dir } - before :each do - @before_dir = ::Dir.pwd - create_temp_cli_dir - create_sprite_temp - File.open(File.join(@test_dir, 'config.rb'), 'w') do |f| - f << config_data - end - end - after :each do - ::Dir.chdir @before_dir - clean_up_sprites - if File.exists?(@test_dir) - ::FileUtils.rm_r @test_dir - end - end - - it "should create sprite file" do - run_compass_with_options(['sprite', "-f", "stylesheet.scss", "'#{@images_tmp_path}/*.png'"]).to_i.should == 0 - File.exists?(File.join(test_dir, 'stylesheet.scss')).should be_true - end - - it "should fail gracfuly when giving bad arguments" do - pending - end - - -end \ No newline at end of file diff --git a/spec/compass/sass_extensions/sprites/base_spec.rb b/spec/compass/sass_extensions/sprites/base_spec.rb deleted file mode 100644 index 4769e17243..0000000000 --- a/spec/compass/sass_extensions/sprites/base_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -require 'spec_helper' -describe Compass::SassExtensions::Sprites::Base do - - before :each do - @images_src_path = File.join(File.dirname(__FILE__), '..', '..', '..', 'test_project', 'public', 'images') - @images_tmp_path = File.join(File.dirname(__FILE__), '..', '..', '..', 'test_project', 'public', 'images-tmp') - FileUtils.cp_r @images_src_path, @images_tmp_path - config = Compass::Configuration::Data.new('config') - config.images_path = @images_tmp_path - Compass.add_configuration(config) - Compass.configure_sass_plugin! - #fix this eww - options = Compass.sass_engine_options.extend Compass::SassExtensions::Functions::Sprites::VariableReader - @map = Compass::SpriteImporter.new("selectors/*.png", options) - @base = Compass::SassExtensions::Sprites::Base.new(@map.sprite_names.map{|n| "selectors/#{n}.png"}, @map.path, 'selectors', @map.sass_engine, @map.options) - end - - after :each do - FileUtils.rm_r @images_tmp_path - end - - subject { @base } - - its(:size) { should == [10,40] } - its(:sprite_names) { should == @map.sprite_names } - its(:image_filenames) { should == Dir["#{@images_tmp_path}/selectors/*.png"].sort } - its(:generation_required?) { should be_true } - its(:uniqueness_hash) { should == 'ef52c5c63a'} - its(:outdated?) { should be_true } - its(:filename) { should == File.join(@images_tmp_path, "#{@base.path}-s#{@base.uniqueness_hash}.png")} - - it "should return the 'ten-by-ten' image" do - subject.image_for('ten-by-ten').name.should == 'ten-by-ten' - subject.image_for('ten-by-ten').should be_a Compass::SassExtensions::Sprites::Image - end - - %w(target hover active).each do |selector| - it "should have a #{selector}" do - subject.send(:"has_#{selector}?", 'ten-by-ten').should be_true - end - - it "should return #{selector} image class" do - subject.image_for('ten-by-ten').send(:"#{selector}").name.should == "ten-by-ten_#{selector}" - end - - end - context "#generate" do - before { @base.generate } - it "should generate sprite" do - File.exists?(@base.filename).should be_true - end - - its(:generation_required?) { should be_false } - its(:outdated?) { should be_false } - end - -end \ No newline at end of file diff --git a/spec/compass/sass_extensions/sprites/image_spec.rb b/spec/compass/sass_extensions/sprites/image_spec.rb deleted file mode 100644 index f328a535d8..0000000000 --- a/spec/compass/sass_extensions/sprites/image_spec.rb +++ /dev/null @@ -1,161 +0,0 @@ -require 'spec_helper' -require 'compass/sass_extensions/sprites/image' - -describe Compass::SassExtensions::Sprites::Image do - let(:sprite_filename) { 'squares/ten-by-ten.png' } - let(:sprite_path) { File.join(images_src_path, sprite_filename) } - let(:sprite_name) { File.basename(sprite_filename, '.png') } - let(:parent) do - mock - end - before do - parent.stubs(:image_for).with('ten-by-ten').returns(image) - parent.stubs(:image_for).with('ten-by-ten_hover').returns(hover_image) - end - let(:image) { self.class.describes.new(parent, File.join(sprite_filename), options)} - let(:hover_image) { self.class.describes.new(parent, File.join('selectors/ten-by-ten_hover.png'), options)} - let(:digest) { Digest::MD5.file(sprite_path).hexdigest } - subject { image } - - before { - file = StringIO.new("images_path = #{images_src_path.inspect}\n") - Compass.add_configuration(file, "sprite_config") - } - - describe '#initialize' do - its(:name) { should == sprite_name } - its(:file) { should == sprite_path } - its(:relative_file) { should == sprite_filename } - its(:width) { should == 10 } - its(:height) { should == 10 } - its(:digest) { should == digest } - its(:top) { should == 0 } - its(:left) { should == 0 } - end - - let(:get_var_expects) { nil } - let(:get_var_return) { nil } - - let(:options) { - options = mock - options.stubs(:get_var).with(anything).returns(nil) - options.stubs(:get_var).with(get_var_expects).returns(get_var_return) - options - } - - describe '#parent' do - context '_hover' do - subject { hover_image } - its(:parent) { should == image } - end - context 'no parent' do - subject { image } - its(:parent) { should be_nil } - end - end - - describe '#repeat' do - let(:type) { nil } - let(:get_var_return) { OpenStruct.new(:value => type) } - - context 'specific image' do - let(:type) { 'specific' } - let(:get_var_expects) { "#{sprite_name}-repeat" } - - its(:repeat) { should == type } - end - - context 'global' do - let(:type) { 'global' } - let(:get_var_expects) { 'repeat' } - - its(:repeat) { should == type } - end - - context 'default' do - let(:get_var_expects) { nil } - - its(:repeat) { should == "no-repeat" } - end - end - - describe '#position' do - let(:type) { nil } - let(:get_var_return) { type } - - context 'specific image' do - let(:type) { 'specific' } - let(:get_var_expects) { "#{sprite_name}-position" } - - its(:position) { should == type } - end - - context 'global' do - let(:type) { 'global' } - let(:get_var_expects) { 'position' } - - its(:position) { should == type } - end - - context 'default' do - let(:get_var_expects) { nil } - - its(:position) { should == Sass::Script::Number.new(0, ["px"]) } - end - end - - describe '#spacing' do - let(:type) { nil } - let(:get_var_return) { OpenStruct.new(:value => type) } - - context 'specific image' do - let(:type) { 'specific' } - let(:get_var_expects) { "#{sprite_name}-spacing" } - - its(:spacing) { should == type } - end - - context 'global' do - let(:type) { 'global' } - let(:get_var_expects) { 'spacing' } - - its(:spacing) { should == type } - end - - context 'default' do - let(:get_var_expects) { nil } - - its(:spacing) { should == Sass::Script::Number.new(0).value } - end - end - - describe '#offset' do - before { image.stubs(:position).returns(stub_position) } - - let(:offset) { 100 } - let(:stub_position) { - stub(:value => offset) - } - - context 'unitless' do - before { stub_position.stubs(:unitless?).returns(true) } - before { stub_position.stubs(:unit_str).returns('em') } - - its(:offset) { should == offset } - end - - context 'pixels' do - before { stub_position.stubs(:unitless?).returns(false) } - before { stub_position.stubs(:unit_str).returns('px') } - - its(:offset) { should == offset } - end - - context 'neither, use 0' do - before { stub_position.stubs(:unitless?).returns(false) } - before { stub_position.stubs(:unit_str).returns('em') } - - its(:offset) { should == 0 } - end - end -end diff --git a/spec/compass/sass_extensions/sprites/sprite_map_spec.rb b/spec/compass/sass_extensions/sprites/sprite_map_spec.rb deleted file mode 100644 index 30a3895df4..0000000000 --- a/spec/compass/sass_extensions/sprites/sprite_map_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'spec_helper' -require 'fakefs/spec_helpers' -require 'timecop' - -describe Compass::SpriteImporter do - include FakeFS::SpecHelpers - - let(:sprite_map) { self.class.describes.new(uri, options) } - let(:options) { { :test => :test2 } } - - subject { sprite_map } - - let(:path) { 'path' } - let(:dir) { "dir/#{name}" } - let(:name) { 'subdir' } - - let(:sprite_path) { File.join(path, dir) } - let(:files) { (1..3).collect { |i| File.join(sprite_path, "#{i}.png") } } - let(:expanded_files) { files.collect { |file| File.expand_path(file) } } - - let(:configuration) { stub(:images_path => path) } - let(:mtime) { Time.now - 30 } - - before { - Compass.stubs(:configuration).returns(configuration) - - FileUtils.mkdir_p(sprite_path) - Timecop.freeze(mtime) do - files.each { |file| File.open(file, 'w') } - end - Timecop.return - } - - describe '#initialize' do - let(:uri) { 'dir/subdir/*.png' } - - its(:uri) { should == uri } - its(:path) { should == dir } - its(:name) { should == name } - - its(:files) { should == expanded_files } - - its(:sass_options) { should == options.merge(:filename => name, :syntax => :scss, :importer => sprite_map) } - - - it "should have a correct mtime" do - sprite_map.mtime(uri, subject.sass_options).should == mtime - end - - it "should have a test for the sass engine" do - pending 'sass' - end - end -end diff --git a/spec/compass/sass_extensions/sprites/sprites_spec.rb b/spec/compass/sass_extensions/sprites/sprites_spec.rb deleted file mode 100644 index 9246d8d302..0000000000 --- a/spec/compass/sass_extensions/sprites/sprites_spec.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'spec_helper' -require 'fakefs/spec_helpers' - -describe Compass::Sprites do -end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb deleted file mode 100644 index 9fee20ea8a..0000000000 --- a/spec/spec_helper.rb +++ /dev/null @@ -1,37 +0,0 @@ -$LOAD_PATH.unshift(File.dirname(__FILE__)) -$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) -require 'rubygems' -require 'compass' -require 'rspec' -require 'rspec/autorun' -require 'mocha' - -module CompassGlobalInclude - class << self - def included(klass) - klass.instance_eval do - let(:images_src_path) { File.join(File.dirname(__FILE__), 'test_project', 'public', 'images') } - end - end - end -end - -module CompassSpriteHelpers - def create_sprite_temp - ::FileUtils.cp_r @images_src_path, @images_tmp_path - end - - def clean_up_sprites - ::FileUtils.rm_r @images_tmp_path - end -end - -RSpec.configure do |config| - config.include(CompassGlobalInclude) - config.include(CompassSpriteHelpers) - config.before :each do - @images_src_path = File.join(File.dirname(__FILE__), 'test_project', 'public', 'images') - @images_tmp_path = File.join(File.dirname(__FILE__), 'test_project', 'public', 'images-tmp') - end - config.mock_with :mocha -end \ No newline at end of file diff --git a/spec/sprites_spec.rb b/spec/sprites_spec.rb deleted file mode 100644 index 2b39c8a3a4..0000000000 --- a/spec/sprites_spec.rb +++ /dev/null @@ -1,571 +0,0 @@ -require File.expand_path(File.dirname(__FILE__) + '/spec_helper') -require 'digest/md5' - -describe Compass::Sprites do - - before :each do - create_sprite_temp - file = StringIO.new("images_path = #{@images_tmp_path.inspect}\n") - Compass.add_configuration(file, "sprite_config") - Compass.configure_sass_plugin! - end - - after :each do - clean_up_sprites - end - - def map_location(file) - Dir.glob(File.join(@images_tmp_path, file)).first - end - - def image_size(file) - IO.read(map_location(file))[0x10..0x18].unpack('NN') - end - - def image_md5(file) - md5 = Digest::MD5.new - md5.update IO.read(map_location(file)) - md5.hexdigest - end - - def render(scss) - scss = %Q(@import "compass"; #{scss}) - options = Compass.sass_engine_options - options[:line_comments] = false - options[:style] = :expanded - options[:syntax] = :scss - css = Sass::Engine.new(scss, options).render - # reformat to fit result of heredoc: - " #{css.gsub('@charset "UTF-8";', '').gsub(/\n/, "\n ").strip}\n" - end - - #Callbacks - describe 'callbacks' do - it "should fire on_sprite_saved" do - saved = false - path = nil - Compass.configuration.on_sprite_saved {|filepath| path = filepath; saved = true } - render <<-SCSS - @import "squares/*.png"; - @include all-squares-sprites; - SCSS - saved.should eq true - path.should be_kind_of String - end - it "should fire on_sprite_generated" do - saved = false - sprite_data = nil - Compass.configuration.on_sprite_generated {|data| sprite_data = data; saved = true } - render <<-SCSS - @import "squares/*.png"; - @include all-squares-sprites; - SCSS - sprite_data.should be_kind_of ChunkyPNG::Image - saved.should eq true - end - end - - # DEFAULT USAGE: - it "should generate sprite classes" do - css = render <<-SCSS - @import "squares/*.png"; - @include all-squares-sprites; - SCSS - css.should == <<-CSS - .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-161c60ad78.png') no-repeat; - } - - .squares-ten-by-ten { - background-position: 0 0; - } - - .squares-twenty-by-twenty { - background-position: 0 -10px; - } - CSS - image_size('squares-*.png').should == [20, 30] - image_md5('squares-*.png').should == 'fcc93d7b279c2ad6898fbca49cbd01e1' - end - - it "should generate sprite classes with dimensions" do - css = render <<-SCSS - $squares-sprite-dimensions: true; - @import "squares/*.png"; - @include all-squares-sprites; - SCSS - css.should == <<-CSS - .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-161c60ad78.png') no-repeat; - } - - .squares-ten-by-ten { - background-position: 0 0; - height: 10px; - width: 10px; - } - - .squares-twenty-by-twenty { - background-position: 0 -10px; - height: 20px; - width: 20px; - } - CSS - image_size('squares-*.png').should == [20, 30] - end - - it "should provide sprite mixin" do - css = render <<-SCSS - @import "squares/*.png"; - - .cubicle { - @include squares-sprite("ten-by-ten"); - } - - .large-cube { - @include squares-sprite("twenty-by-twenty", true); - } - SCSS - css.should == <<-CSS - .squares-sprite, .cubicle, .large-cube { - background: url('/squares-161c60ad78.png') no-repeat; - } - - .cubicle { - background-position: 0 0; - } - - .large-cube { - background-position: 0 -10px; - height: 20px; - width: 20px; - } - CSS - image_size('squares-*.png').should == [20, 30] - end - - # CUSTOMIZATIONS: - - it "should be possible to change the base class" do - css = render <<-SCSS - $squares-sprite-base-class: ".circles"; - @import "squares/*.png"; - SCSS - css.should == <<-CSS - .circles { - background: url('/squares-161c60ad78.png') no-repeat; - } - CSS - image_size('squares-*.png').should == [20, 30] - end - - it "should calculate the spacing between images but not before first image" do - css = render <<-SCSS - $squares-ten-by-ten-spacing: 33px; - @import "squares/*.png"; - @include all-squares-sprites; - SCSS - css.should == <<-CSS - .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-89450808af.png') no-repeat; - } - - .squares-ten-by-ten { - background-position: 0 0; - } - - .squares-twenty-by-twenty { - background-position: 0 -43px; - } - CSS - image_size('squares-*.png').should == [20, 63] - end - - it "should calculate the spacing between images" do - css = render <<-SCSS - $squares-twenty-by-twenty-spacing: 33px; - @import "squares/*.png"; - @include all-squares-sprites; - SCSS - css.should == <<-CSS - .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-673837183a.png') no-repeat; - } - - .squares-ten-by-ten { - background-position: 0 0; - } - - .squares-twenty-by-twenty { - background-position: 0 -43px; - } - CSS - image_size('squares-*.png').should == [20, 63] - end - - it "should calculate the maximum spacing between images" do - css = render <<-SCSS - $squares-ten-by-ten-spacing: 44px; - $squares-twenty-by-twenty-spacing: 33px; - @import "squares/*.png"; - @include all-squares-sprites; - SCSS - css.should == <<-CSS - .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-1cd84c9068.png') no-repeat; - } - - .squares-ten-by-ten { - background-position: 0 0; - } - - .squares-twenty-by-twenty { - background-position: 0 -54px; - } - CSS - image_size('squares-*.png').should == [20, 74] - end - - it "should calculate the maximum spacing between images in reversed order" do - css = render <<-SCSS - $squares-ten-by-ten-spacing: 33px; - $squares-twenty-by-twenty-spacing: 44px; - @import "squares/*.png"; - @include all-squares-sprites; - SCSS - css.should == <<-CSS - .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-f25b7090ca.png') no-repeat; - } - - .squares-ten-by-ten { - background-position: 0 0; - } - - .squares-twenty-by-twenty { - background-position: 0 -54px; - } - CSS - image_size('squares-*.png').should == [20, 74] - end - - it "should calculate the default spacing between images" do - css = render <<-SCSS - $squares-spacing: 22px; - @import "squares/*.png"; - @include all-squares-sprites; - SCSS - css.should == <<-CSS - .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-d66bf24bab.png') no-repeat; - } - - .squares-ten-by-ten { - background-position: 0 0; - } - - .squares-twenty-by-twenty { - background-position: 0 -32px; - } - CSS - image_size('squares-*.png').should == [20, 52] - end - - it "should use position adjustments in functions" do - css = render <<-SCSS - $squares: sprite-map("squares/*.png", $position: 100%); - .squares-sprite { - background: $squares no-repeat; - } - - .adjusted-percentage { - background-position: sprite-position($squares, ten-by-ten, 100%); - } - - .adjusted-px-1 { - background-position: sprite-position($squares, ten-by-ten, 4px); - } - - .adjusted-px-2 { - background-position: sprite-position($squares, twenty-by-twenty, -3px, 2px); - } - SCSS - css.should == <<-CSS - .squares-sprite { - background: url('/squares-8e490168dd.png') no-repeat; - } - - .adjusted-percentage { - background-position: 100% 0; - } - - .adjusted-px-1 { - background-position: -6px 0; - } - - .adjusted-px-2 { - background-position: -3px -8px; - } - CSS - image_size('squares-*.png').should == [20, 30] - image_md5('squares-*.png').should == '652b67f5e9092520d6f26caae7e18012' - end - - it "should use position adjustments in mixins" do - css = render <<-SCSS - $squares-position: 100%; - @import "squares/*.png"; - - .adjusted-percentage { - @include squares-sprite("ten-by-ten", $offset-x: 100%); - } - - .adjusted-px-1 { - @include squares-sprite("ten-by-ten", $offset-x: 4px); - } - - .adjusted-px-2 { - @include squares-sprite("twenty-by-twenty", $offset-x: -3px, $offset-y: 2px); - } - SCSS - css.should == <<-CSS - .squares-sprite, .adjusted-percentage, .adjusted-px-1, .adjusted-px-2 { - background: url('/squares-8e490168dd.png') no-repeat; - } - - .adjusted-percentage { - background-position: 100% 0; - } - - .adjusted-px-1 { - background-position: -6px 0; - } - - .adjusted-px-2 { - background-position: -3px -8px; - } - CSS - image_size('squares-*.png').should == [20, 30] - image_md5('squares-*.png').should == '652b67f5e9092520d6f26caae7e18012' - end - - it "should repeat the image" do - css = render <<-SCSS - $squares-repeat: repeat; - @import "squares/*.png"; - @include all-squares-sprites; - SCSS - css.should == <<-CSS - .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-a5550fd132.png') no-repeat; - } - - .squares-ten-by-ten { - background-position: 0 0; - } - - .squares-twenty-by-twenty { - background-position: 0 -10px; - } - CSS - image_size('squares-*.png').should == [20, 30] - image_md5('squares-*.png').should == '94abae8440f1b58617f52920b70aaed2' - end - - it "should allow the position of a sprite to be specified in absolute pixels" do - css = render <<-SCSS - $squares-ten-by-ten-position: 10px; - $squares-twenty-by-twenty-position: 10px; - @import "squares/*.png"; - @include all-squares-sprites; - SCSS - css.should == <<-CSS - .squares-sprite, .squares-ten-by-ten, .squares-twenty-by-twenty { - background: url('/squares-89a274044e.png') no-repeat; - } - - .squares-ten-by-ten { - background-position: -10px 0; - } - - .squares-twenty-by-twenty { - background-position: -10px -10px; - } - CSS - image_size('squares-*.png').should == [30, 30] - image_md5('squares-*.png').should == '2fb19ef9c83018c93c6f147af3a56cb2' - end - - it "should provide a nice errors for lemonade's old users" do - proc do - render <<-SCSS - .squares { - background: sprite-url("squares/*.png") no-repeat; - } - SCSS - end.should raise_error Sass::SyntaxError, - %q(The first argument to sprite-url() must be a sprite map. See http://beta.compass-style.org/help/tutorials/spriting/ for more information.) - proc do - render <<-SCSS - .squares { - background: sprite-image("squares/twenty-by-twenty.png") no-repeat; - } - SCSS - end.should raise_error Sass::SyntaxError, - %q(The sprite-image() function has been replaced by sprite(). See http://beta.compass-style.org/help/tutorials/spriting/ for more information.) - proc do - render <<-SCSS - @import "squares/*.png"; - - .squares { - background: sprite-position("squares/twenty-by-twenty.png") no-repeat; - } - SCSS - end.should raise_error Sass::SyntaxError, - %q(The first argument to sprite-position() must be a sprite map. See http://beta.compass-style.org/help/tutorials/spriting/ for more information.) - end - - it "should work even if @import is missing" do - actual_css = render <<-SCSS - .squares { - background: sprite(sprite-map("squares/*.png"), twenty-by-twenty) no-repeat; - } - SCSS - actual_css.should == <<-CSS - .squares { - background: url('/squares-145869726f.png') 0 -10px no-repeat; - } - CSS - end - - it "should calculate corret sprite demsions when givin spacing via issue#253" do - css = render <<-SCSS - $squares-spacing: 10px; - @import "squares/*.png"; - .foo { - @include sprite-background-position($squares-sprites, "twenty-by-twenty"); - } - .bar { - @include sprite-background-position($squares-sprites, "ten-by-ten"); - } - SCSS - image_size('squares-*.png').should == [20, 40] - css.should == <<-CSS - .squares-sprite { - background: url('/squares-e3c68372d9.png') no-repeat; - } - - .foo { - background-position: 0 -20px; - } - - .bar { - background-position: 0 0; - } - CSS - end - - it "should render corret sprite with css selectors via issue#248" do - css = render <<-SCSS - @import "selectors/*.png"; - @include all-selectors-sprites; - SCSS - css.should == <<-CSS - .selectors-sprite, .selectors-ten-by-ten { - background: url('/selectors-edfef809e2.png') no-repeat; - } - - .selectors-ten-by-ten { - background-position: 0 0; - } - .selectors-ten-by-ten:hover, .selectors-ten-by-ten.ten-by-ten_hover, .selectors-ten-by-ten.ten-by-ten-hover { - background-position: 0 -20px; - } - .selectors-ten-by-ten:target, .selectors-ten-by-ten.ten-by-ten_target, .selectors-ten-by-ten.ten-by-ten-target { - background-position: 0 -30px; - } - .selectors-ten-by-ten:active, .selectors-ten-by-ten.ten-by-ten_active, .selectors-ten-by-ten.ten-by-ten-active { - background-position: 0 -10px; - } - CSS - end - - it "should render corret sprite with css selectors via magic mixin" do - css = render <<-SCSS - @import "selectors/*.png"; - a { - @include selectors-sprite(ten-by-ten) - } - SCSS - css.should == <<-CSS - .selectors-sprite, a { - background: url('/selectors-edfef809e2.png') no-repeat; - } - - a { - background-position: 0 0; - } - a:hover, a.ten-by-ten_hover, a.ten-by-ten-hover { - background-position: 0 -20px; - } - a:target, a.ten-by-ten_target, a.ten-by-ten-target { - background-position: 0 -30px; - } - a:active, a.ten-by-ten_active, a.ten-by-ten-active { - background-position: 0 -10px; - } - CSS - end - - it "should not render corret sprite with css selectors via magic mixin" do - css = render <<-SCSS - @import "selectors/*.png"; - a { - $disable-magic-sprite-selectors:true; - @include selectors-sprite(ten-by-ten) - } - SCSS - css.should == <<-CSS - .selectors-sprite, a { - background: url('/selectors-edfef809e2.png') no-repeat; - } - - a { - background-position: 0 0; - } - CSS - end - - it "should raise error on filenames that are not valid sass syntax" do - lambda do - render <<-SCSS - @import "prefix/*.png"; - a { - @include squares-sprite(20-by-20); - } - SCSS - end.should raise_error Compass::Error - end - - it "should generate sprite with bad repeat-x dimensions" do - css = render <<-SCSS - $ko-starbg26x27-repeat: repeat-x; - @import "ko/*.png"; - @include all-ko-sprites; - SCSS - css.should == <<-CSS - .ko-sprite, .ko-default_background, .ko-starbg26x27 { - background: url('/ko-cc3f80660d.png') no-repeat; - } - - .ko-default_background { - background-position: 0 0; - } - - .ko-starbg26x27 { - background-position: 0 -128px; - } - CSS - end - -end diff --git a/spec/test_project/public/images/ko/default_background.png b/spec/test_project/public/images/ko/default_background.png deleted file mode 100644 index b98cd7f9476b78880c84f878790179263f802257..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3113 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 DNFA4( diff --git a/spec/test_project/public/images/ko/starbg26x27.png b/spec/test_project/public/images/ko/starbg26x27.png deleted file mode 100755 index 48dee0dba6a00fd37685ac90a39858d86aa50cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1079 zcmV-71jze|P)mBv)T{f%L8uR=8ohvIVB^HY% zp-(-<7P+Yd``vE$@cH?9wQxC|&VIe?DYlST2afIU?}sH4Ld@s$A%cwsmt9}D4CQ({ z1d->iQoWeSWHN~Kh(=Kp2n0Iyex#s^J{(DSstB3PsE26lIM zNA%5rXccwTNGnVb1%-maV0>?HZ$X?YinyX$sG|8+z_wCtg(^WwhOYgKbo)F2>y!fOt9 z8LLY5w8i6bHs2NZM6ZFtrTeJYb0eJ8GbSo?#cFlEOzrIKl<7by5e{KJI5@CwY;0I` zD_}JnTLp~(-3D5nY!GLNpNJP?JXZ)`=OpG1g+g|Z$78RotR#A1kZ%d*t0fO)hg}GF z2}BVb7BtI+#X$>#qT)X{1;fe{Yki_Y1aqj@-yzW`7k!3_KZ~g79Q-CKA}31T*9ipZBK}Ko3+e>?=6y^&6MX{v z2<(CYO4vftMg{)jHFZEND?(-*O1D)Atj*d>$5C*XpzZU{5QWCiNf92`jL_8T`w2h|DN5mXSG)LDLX9w*nc`KzXzHTbUtaz(^k< z{N*=S3U)j+&_QH}5E&r`*!f>V6mQxbMwiTp*Ma~jC|S4!GeJkvVblmgAS0~1bk*qH zg@xxF@LoI>Sj6n)Zp0?C!{TgHAOeem?25J!=l){qvol1aAVgCXb#XBEQcG$^GZj6f xY{bkNVqw8(ycJxwMPIabhY{m8;nuiv{Q`evSC2M2B`^R0002ovPDHLkV1mf%+(rNZ diff --git a/spec/test_project/public/images/prefix/20-by-20.png b/spec/test_project/public/images/prefix/20-by-20.png deleted file mode 100644 index 4e5e297ffe74b97eaac97d132bea620d976120a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2799 zcmV)P)4Tx0C)k_mUmQB$sWh&-t5!0D$We?#oOQB8gjh?!F5wOq$!XIXzYo8oZzjV*CRZI8Njlw7|kN*B>}AWI@k~ck^H1*i?_jJPB+c z@t)1)7o`VK- zTn5*|N8vX3B774bfQR5$@H7gbNGLi=4P}I~MY*8@P?4xOlnAvERe&l*)uNhFov0qv zUDOb267?C4MN`oXv=Q0??TrpabI>X1jp!nDIl3O*hQ5rxiylT#p}%7&7$uAW#va4M ztibRvnV5V`Ddq^K6>|kMfEmSnz+$my3@TCSccLi?CJL7Hk)`A3K7b#^G@C zI0Kv`E&#{IrQz~%`*BBc7jSoQqqt9a5?&Q=j`zez;sy9zd?~&We;$7aKZc(nND;IM z_JjZemyk^;CLAVo5^fVl2{S}#q7KoK7(z@SZXuQtn~7J5Pl)eGB$7JGjBElrg+ zlMawhmM)TRl)f%KE`yWNmhq6`%H+u$lDQ-^LPb$EsBTmabu0BS^$K;AhNbDyShNIM zA?+Bgmo_CUBWo!eCYvQ&A$v}Ch>oIb(^>Q+dNKVZ{XYH666GZ>OJbL7U(&qf&XSLE zigHZ3Sh)hZ7P$erFY*j|5BWs-UGnYnPZiJ#`U=YxG8GOeTv3=*q$xTmauf>`PbxlA zf|c}@f|S-N9a6fbG_9MJ-miQ~c~XV0!c<96*`sn^WkQvz>ZHn7-J^Oz^(8}= z;lfB_lrb(drqqoj|7u5ZpUuQ0!7L9y_(*ksXR@y61?GS>2d zt^c-8%>*Nn@XEOTbga4ZISIYJB*#H-6p%UcAxF7?bGZ} z+W+NXmwSPGuZN6Bs7JZSGf#C-o@bNil$Vv)IGK<4%U`_eh_-ydG>`V3y_AU2)zD$3aXj!Kp?C0aR+wY0LmcPKiJpcr- z0(J*H4b%xt3H)t2c6s3PisdhY%!1Yj^#oIc*912Pe+Y36DGqrYsvDXf+8rht78TYI z_A%T&yd->Rg~^HyD{e+8MDQazB5{#nkw+q@S9+}6yK*$jDk?wf{wkeSS*xzER#=_1 z`rI1HHS9H~qA}6o(T&kx*#YcY_H+y@rZQ%V{-2rLIctNTVTU=2p6H`cLV@8BQ4$8J{x4GEZemX9==yW$R~e z&mPP1%=vX4dL3t7_jLjG z`>o+yJM)zDHs_7}cizC^w#e{h?_w(6hJKl6X?-EOgc|Mu?%+=3g0riG=2UyC?J zH-0hurR-?f?8NRA?7Y9rc~^ajbV*Lh$Zo&gZF?Ad3iiC;yJqk8Qp?in zeZ+m~`-aMvm38db+`n`G*Yf!CfeP1(mP)0{?Uf&^xK(!!Fb_0WD_0j*e>uoM_@KtC zrma@Hw)7D8P{yGbhrC3F?OGgX%9g*fcaWDm4~2!A2tDLf92ryqZLBKpMrlfEarPuZSoKCN}SvX$Ce&<3?-w@tOjw-0qh zbo8I`In&+g(AoN%@o#l!)y`I&lRZ~_o_Id*{OpCC3)5Y~uE~qMizD4@x*uO!ap~UW z<(GS}_+Gho)${759+#dA*Bq~%y>5T~%njQc?KiD&w%xM2)%v^D@2$Poy=}K`Zg=$A z^>y|y?LU9V`Od|=?su==W8J$s;6KoRKlJ{C!KlHZ2iyna50f6gd6e;J=JDnym?s5K zrJj~PQ+ihWhu$A8L)Js*hTVs6Jr92Vc!V?Z>d(|azmDd;pu8v@QypsSHf2_lllLW{#WH|-Pfo8V*Yh&YQ@y(8_}EDw?*&d-_^aheBV7CIQ{HH@`ss^ z1)t=@-0@RJ`HGBX7002ovPDHLkV1j+) BIe!2E diff --git a/spec/test_project/public/images/prefix/ten-by-ten.png b/spec/test_project/public/images/prefix/ten-by-ten.png deleted file mode 100644 index c0ae53ccadde24b58be417ca95dcb57eb6da4f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2804 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 BIe!2E