# encoding: UTF-8
require 'spec_helper'

module Roadie
  describe Stylesheet do
    it "is initialized with a name and CSS" do
      stylesheet = Stylesheet.new("foo.css", "body { color: green; }")
      expect(stylesheet.name).to eq("foo.css")
    end

    it "has a list of blocks" do
      stylesheet = Stylesheet.new("foo.css", <<-CSS)
        body { color: green !important; font-size: 200%; }
        a, i { color: red; }
      CSS
      expect(stylesheet).to have(3).blocks
      expect(stylesheet.blocks.map(&:to_s)).to eq([
        "body{color:green !important;font-size:200%}",
        "a{color:red}",
        "i{color:red}",
      ])
    end

    if VERSION < "4.0"
      it "can iterate all inlinable blocks" do
        inlinable = double(inlinable?: true, selector: "good", properties: "props")
        bad = double(inlinable?: false, selector: "bad", properties: "props")

        stylesheet = Stylesheet.new("example.css", "")
        allow(stylesheet).to receive_messages blocks: [bad, inlinable, bad]

        expect(stylesheet.each_inlinable_block.to_a).to eq([
          ["good", "props"],
        ])
      end
    else
      it "should no longer have #each_inlinable_block" do
        fail "Remove #each_inlinable_block"
      end
    end

    it "has a string representation of the contents" do
      stylesheet = Stylesheet.new("example.css", "body { color: green;}a{ color: red; font-size: small }")
      expect(stylesheet.to_s).to eq("body{color:green}\na{color:red;font-size:small}")
    end

    it "understands data URIs" do
      # http://css-tricks.com/data-uris/
      stylesheet = Stylesheet.new("foo.css", <<-CSS)
      h1 {
        background-image: url(data:image/gif;base64,R0lGODl)
      }
      CSS

      expect(stylesheet).to have(1).blocks
      expect(stylesheet.blocks.map(&:to_s)).to eq([
        "h1{background-image:url(data:image/gif;base64,R0lGODl)}"
      ])
    end

    it "does not mutate the input CSS" do
      input = "/* comment */ body { color: green; }"
      input_copy = input.dup
      expect {
        Stylesheet.new("name", input)
      }.to_not change { input }.from(input_copy)
    end

    it "strips UTF-8 Byte Order Mark" do
      input = "\xEF\xBB\xBFbody { color: green; }"
      stylesheet = Stylesheet.new("bom.css", input)
      expect(stylesheet.to_s).to eq "body{color:green}"
    end
  end
end
