# -*- encoding: utf-8 -*-
require File.dirname(__FILE__) + '/test_helper'

class TestBase < Minitest::Test

  def setup
    @klass = Class.new(Roo::Base) do
      def initialize(filename='some_file')
        super
        @filename = filename
      end

      def read_cells(sheet=nil)
        @cells_read[sheet] = true
      end

      def cell(row, col, sheet=nil)
        sheet ||= default_sheet
        @cell[sheet][[row,col]]
      end

      def celltype(row, col, sheet=nil)
        sheet ||= default_sheet
        @cell_type[sheet][[row,col]]
      end

      def sheets
        ['my_sheet','blank sheet']
      end
    end
    @oo = @klass.new
    setup_test_sheet(@oo)
  end

  context 'private method Roo::Base.uri?(filename)' do
    should "return true when passed a filename starts with http(s)://" do
      assert_equal true, @oo.send(:uri?, 'http://example.com/')
      assert_equal true, @oo.send(:uri?, 'https://example.com/')
    end

    should "return false when passed a filename which does not start with http(s)://" do
      assert_equal false, @oo.send(:uri?, 'example.com')
    end

    should "return false when passed non-String object such as Tempfile" do
      assert_equal false, @oo.send(:uri?, Tempfile.new('test'))
    end
  end

  def test_setting_invalid_type_does_not_update_cell
    @oo.set(1,1,1)
    assert_raises(ArgumentError){@oo.set(1,1, :invalid_type)}
    assert_equal 1, @oo.cell(1,1)
    assert_equal :float, @oo.celltype(1,1)
  end

  def test_first_row
    assert_equal 5,@oo.first_row
  end

  def test_last_row
    assert_equal 16,@oo.last_row
  end

  def test_first_column
    assert_equal 1,@oo.first_column
  end

  def test_first_column_as_letter
    assert_equal 'A', @oo.first_column_as_letter
  end

  def test_last_column
    assert_equal 7, @oo.last_column
  end

  def test_last_column_as_letter
    assert_equal 'G', @oo.last_column_as_letter
  end

  #TODO: inkonsequente Lieferung Fixnum/Float
  def test_rows
    assert_equal [41.0,42.0,43.0,44.0,45.0, nil, nil], @oo.row(12)
    assert_equal [nil, nil, "dreiundvierzig", "vierundvierzig", "fuenfundvierzig", nil, nil], @oo.row(16)
  end

  def test_empty_eh
    assert @oo.empty?(1,1)
    assert !@oo.empty?(8,3)
    assert @oo.empty?("A",11)
    assert !@oo.empty?("A",12)
  end

  def test_reload
    @oo.reload
    assert @oo.instance_variable_get(:@cell).empty?
  end

  def test_to_yaml
    assert_equal "--- \n"+yaml_entry(5,1,"date","1961-11-21"), @oo.to_yaml({}, 5,1,5,1)
    assert_equal "--- \n"+yaml_entry(8,3,"string","thisisc8"), @oo.to_yaml({}, 8,3,8,3)
    assert_equal "--- \n"+yaml_entry(12,3,"float",43.0), @oo.to_yaml({}, 12,3,12,3)
    assert_equal \
      "--- \n"+yaml_entry(12,3,"float",43.0) +
      yaml_entry(12,4,"float",44.0) +
      yaml_entry(12,5,"float",45.0), @oo.to_yaml({}, 12,3,12)
    assert_equal \
      "--- \n"+yaml_entry(12,3,"float",43.0)+
      yaml_entry(12,4,"float",44.0)+
      yaml_entry(12,5,"float",45.0)+
      yaml_entry(15,3,"float",43.0)+
      yaml_entry(15,4,"float",44.0)+
      yaml_entry(15,5,"float",45.0)+
      yaml_entry(16,3,"string","dreiundvierzig")+
      yaml_entry(16,4,"string","vierundvierzig")+
      yaml_entry(16,5,"string","fuenfundvierzig"), @oo.to_yaml({}, 12,3)
  end

  def test_to_csv
    assert_equal expected_csv,@oo.to_csv
  end

  def test_to_csv_with_separator
    assert_equal expected_csv_with_semicolons,@oo.to_csv(nil, ';')
  end
protected
  def setup_test_sheet(workbook=nil)
    workbook ||= @oo
    set_sheet_values(workbook)
    set_sheet_types(workbook)
    set_cells_read(workbook)
  end

  def set_sheet_values(workbook)
    workbook.instance_variable_get(:@cell)[workbook.default_sheet] = {
      [5,1] => Date.civil(1961,11,21).to_s,

      [8,3] => "thisisc8",
      [8,7] => "thisisg8",

      [12,1] => 41.0,
      [12,2] => 42.0,
      [12,3] => 43.0,
      [12,4] => 44.0,
      [12,5] => 45.0,

      [15,3] => 43.0,
      [15,4] => 44.0,
      [15,5] => 45.0,

      [16,3] => "dreiundvierzig",
      [16,4] => "vierundvierzig",
      [16,5] => "fuenfundvierzig"
    }
  end

  def set_sheet_types(workbook)
    workbook.instance_variable_get(:@cell_type)[workbook.default_sheet] = {
      [5,1] => :date,

      [8,3] => :string,
      [8,7] => :string,

      [12,1] => :float,
      [12,2] => :float,
      [12,3] => :float,
      [12,4] => :float,
      [12,5] => :float,

      [15,3] => :float,
      [15,4] => :float,
      [15,5] => :float,

      [16,3] => :string,
      [16,4] => :string,
      [16,5] => :string,
    }
  end

  def set_first_row(workbook)
    row_hash = workbook.instance_variable_get(:@first_row)
    row_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map{|k,v| k[0]}.min
  end

  def set_last_row(workbook)
    row_hash = workbook.instance_variable_get(:@last_row)
    row_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map{|k,v| k[0]}.max
  end

  def set_first_col(workbook)
    col_hash = workbook.instance_variable_get(:@first_column)
    col_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map{|k,v| k[1]}.min
  end

  def set_last_col(workbook)
    col_hash = workbook.instance_variable_get(:@last_column)
    col_hash[workbook.default_sheet] = workbook.instance_variable_get(:@cell)[workbook.default_sheet].map{|k,v| k[1]}.max
  end

  def set_cells_read(workbook)
    read_hash = workbook.instance_variable_get(:@cells_read)
    read_hash[workbook.default_sheet] = true
  end

  def expected_csv
    ",,,,,,\n,,,,,,\n,,,,,,\n,,,,,,\n1961-11-21,,,,,,\n,,,,,,\n,,,,,,\n,,\"thisisc8\",,,,\"thisisg8\"\n,,,,,,\n,,,,,,\n,,,,,,\n41,42,43,44,45,,\n,,,,,,\n,,,,,,\n,,43,44,45,,\n,,\"dreiundvierzig\",\"vierundvierzig\",\"fuenfundvierzig\",,\n"
  end
  def expected_csv_with_semicolons
    expected_csv.gsub /\,/, ';'
  end
end