require_relative 'test_helper'

describe "FastExcel validations" do

  it "should raise error when duplicate sheet name" do
    workbook = FastExcel.open(constant_memory: true)

    workbook.add_worksheet("Payments Report")
    error = assert_raises do
      workbook.add_worksheet("Payments Report")
    end

    assert_equal(ArgumentError, error.class)
    assert_equal("Invalid worksheet name 'Payments Report': (17 - error_sheetname_already_used) Worksheet name is already in use.", error.message)
  end

  it "should not raise error when worksheet name is null" do
    workbook = FastExcel.open(constant_memory: true)

    ws1 = workbook.add_worksheet()
    ws2 = workbook.add_worksheet()
    ws2.write_value(0, 2, "aaa")

    assert_equal("Sheet1", ws1[:name])
    assert_equal("Sheet2", ws2[:name])
  end

  it "should raise error when the sheet name exceeds maximum length" do
    workbook = FastExcel.open(constant_memory: true)

    error = assert_raises do
      workbook.add_worksheet("ABCDEFGHIJKLMNOPQRSTUVWXYZ012345")
    end

    assert_equal(ArgumentError, error.class)
    assert_equal("Invalid worksheet name 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345': (14 - error_sheetname_length_exceeded) Worksheet name exceeds Excel's limit of 31 characters.", error.message)
  end

  it "should not raise error when the sheet name is at maximum length" do
    workbook = FastExcel.open(constant_memory: true)

    worksheet = workbook.add_worksheet("ABCDEFGHIJKLMNOPQRSTUVWXYZ01234")
    worksheet.append_row(["aaa", "bbb", "ccc"])

    assert_equal("ABCDEFGHIJKLMNOPQRSTUVWXYZ01234", worksheet[:name])
  end

  it "should validate using Libxlsxwriter validation" do
    workbook = FastExcel.open(constant_memory: true)
    error = assert_raises do
      worksheet = workbook.add_worksheet('a?')
      worksheet.write_value(1, 1, 'a') # without the validation, this method will crash the process
    end

    assert_equal(ArgumentError, error.class)
    assert_equal("Invalid worksheet name 'a?': (15 - error_invalid_sheetname_character) Worksheet name cannot contain invalid characters: '[ ] : * ? / \\'", error.message)
  end
end
