require_relative "test_helper"

class MojoMagickOptBuilderTest < MiniTest::Test
  # These tests make the assumption that if we call #raw_command with the
  # correct strings, ImageMagick itself will operate correctly. We're only
  # verifying that the option builder produces the correct strings

  def setup
    @builder = MojoMagick::OptBuilder.new
  end

  def test_annotate
    @builder.annotate "blah"
    assert_equal %w[-annotate 0 blah], @builder.to_a
  end

  def test_annotate_with_escapeable_string
    @builder.annotate "it's"
    assert_equal %w[-annotate 0 it's], @builder.to_a
  end

  def test_annotate_with_full_args
    @builder.annotate "5 it's"
    assert_equal %w[-annotate 5 it's], @builder.to_a
  end

  def test_annotate_with_full_args
    @builder.annotate "this thing", geometry: 3
    assert_equal ["-annotate", "3", "this thing"], @builder.to_a
  end

  def test_annotate_with_full_array_args
    @builder.annotate "this", "thing", geometry: 3
    assert_equal ["-annotate", "3", "thisthing"], @builder.to_a
  end

  def test_option_builder_with_blocks
    # Passing in basic commands produces a string
    b = MojoMagick::OptBuilder.new
    b.image_block do
      b.background "red"
    end
    b.image_block do
      b.background "blue"
    end
    assert_equal ['\(', "-background", "red", '\)', '\(', "-background", "blue", '\)'], b.to_a
  end

  def test_option_builder_with_hex_colors
    b = MojoMagick::OptBuilder.new
    b.background "#000000"
    assert_equal %w[-background #000000], b.to_a
  end

  def test_option_builder
    # Passing in basic commands produces a string
    b = MojoMagick::OptBuilder.new
    b.strip
    b.repage
    assert_equal "-strip -repage", b.to_s

    # Chaining commands works
    b = MojoMagick::OptBuilder.new.strip.repage
    assert_equal "-strip -repage", b.to_s

    # Bang (!) indicates the plus version of commands
    b = MojoMagick::OptBuilder.new
    b.repage
    b.repage!
    assert_equal "-repage +repage", b.to_s

    # Accepts raw data as-is
    b = MojoMagick::OptBuilder.new
    b.opt1
    b << "a ! b !"
    b.opt2
    assert_equal "-opt1 a ! b ! -opt2", b.to_s

    # Treats an array of raw data as different arguments
    b = MojoMagick::OptBuilder.new
    b << ["leave this data", "alone"]
    assert_equal "leave this data alone", b.to_s

    # String includes command arguments
    b = MojoMagick::OptBuilder.new
    b.extent "256x256+0+0"
    b.crop "64x64"
    assert_equal %w[-extent 256x256+0+0 -crop 64x64], b.to_a

    # Arguments are quoted (doublequote) if appropriate
    b = MojoMagick::OptBuilder.new
    b.comment "white space"
    b.comment "w&b"
    b.crop "6x6^"
    assert_equal ["-comment", "white space", "-comment", "w&b", "-crop", "6x6^"], b.to_a

    # Existing doublequotes are escaped
    b = MojoMagick::OptBuilder.new
    b.comment 'Fred "Woot" Rook'
    assert_equal ["-comment", "Fred \"Woot\" Rook"], b.to_a

    # Multi-argument commands should not be quoted together
    b = MojoMagick::OptBuilder.new
    b.set "comment", 'the "best" comment'
    assert_equal ["-set", "comment", "the \"best\" comment"], b.to_a

    # File and files are helper methods
    b = MojoMagick::OptBuilder.new
    b.files "source.jpg", "source2.jpg"
    b.append
    b.crop "64x64"
    b.file "dest%d.jpg"
    assert_equal %w[source.jpg source2.jpg -append -crop 64x64 dest%d.jpg], b.to_a

    # Files are quoted (doublequote) if appropriate
    b = MojoMagick::OptBuilder.new
    b.file "probably on windows.jpg"
    assert_equal ["probably on windows.jpg"], b.to_a

    # Blob is a shortcut for the #tempfile helper method
    b = MojoMagick::OptBuilder.new
    b.blob "binary data"
    filename = b.to_s
    File.open(filename, "rb") do |f|
      assert_equal "binary data", f.read
    end

    # label for text should use 'label:"the string"' if specified
    [%w[mylabel mylabel],
     ['my " label', '"my \" label"'],
     ["Rock it, cuz i said so!", '"Rock it, cuz i said so!"'],
     ["it's like this", '"it\'s like this"'],
     ["\#$%^&*", '"#$%^&*"']].each do |labels|
      b = MojoMagick::OptBuilder.new
      b.label labels[0]
      assert_equal "label:#{labels[1]}", b.to_s
    end
  end
end