text: # frozen_string_literal: false
  
  require_relative "../helper"
  
  class TestCSVParseSkipLines < Test::Unit::TestCase
    extend DifferentOFS
    include Helper
  
    def test_default
      csv = CSV.new("a,b,c\n")
      assert_nil(csv.skip_lines)
    end
  
    def test_regexp
      csv = <<-CSV
  1
  #2
   #3
  4
      CSV
      assert_equal([
                     ["1"],
                     ["4"],
                   ],
                   CSV.parse(csv, :skip_lines => /\A\s*#/))
    end
  
    def test_regexp_quoted
      csv = <<-CSV
  1
  #2
  "#3"
  4
      CSV
      assert_equal([
                     ["1"],
                     ["#3"],
                     ["4"],
                   ],
                   CSV.parse(csv, :skip_lines => /\A\s*#/))
    end
  
    def test_string
      csv = <<-CSV
  1
  .2
  3.
  4
      CSV
      assert_equal([
                     ["1"],
                     ["4"],
                   ],
                   CSV.parse(csv, :skip_lines => "."))
    end
  
    class RegexStub
    end
  
    def test_not_matchable
      regex_stub = RegexStub.new
      csv = CSV.new("1\n", :skip_lines => regex_stub)
      error = assert_raise(ArgumentError) do
        csv.shift
      end
      assert_equal(":skip_lines has to respond to #match: #{regex_stub.inspect}",
                   error.message)
    end
  
    class Matchable
      def initialize(pattern)
        @pattern = pattern
      end
  
      def match(line)
        @pattern.match(line)
      end
    end
  
    def test_matchable
      csv = <<-CSV
  1
  # 2
  3
  # 4
      CSV
      assert_equal([
                     ["1"],
                     ["3"],
                   ],
                   CSV.parse(csv, :skip_lines => Matchable.new(/\A#/)))
    end
  
    def test_multibyte_data
      # U+3042 HIRAGANA LETTER A
      # U+3044 HIRAGANA LETTER I
      # U+3046 HIRAGANA LETTER U
      value = "\u3042\u3044\u3046"
      with_chunk_size("5") do
        assert_equal([[value], [value]],
                     CSV.parse("#{value}\n#{value}\n",
                               :skip_lines => /\A#/))
      end
    end
  end
  