" vim: fdm=indent
source t/config/options.vim

describe 'table'
  describe 'IsRow'
    before
      new
      normal! ggdG
      read t/fixtures/table/sample.txt
    end

    it 'should be true when on a table row'
      Expect tablemode#table#IsRow(2) to_be_true
      Expect tablemode#table#IsRow(3) to_be_true
    end

    it 'should be false when not on a table row'
      Expect tablemode#table#IsRow(1) to_be_false
      Expect tablemode#table#IsRow(4) to_be_false
    end
  end

  describe 'IsBorder'
    before
      new
      normal! ggdG
      read t/fixtures/table/sample_with_header.txt
    end

    it 'should be true on a table border'
      Expect tablemode#table#IsBorder(1) to_be_true
      Expect tablemode#table#IsBorder(3) to_be_true
      Expect tablemode#table#IsBorder(6) to_be_true
    end

    it 'should be false when not on a table border'
      Expect tablemode#table#IsBorder(2) to_be_false
      Expect tablemode#table#IsBorder(4) to_be_false
      Expect tablemode#table#IsBorder(5) to_be_false
    end
  end

  describe 'IsTable'
    before
      new normal! ggdG
      read t/fixtures/table/sample_with_header.txt
    end

    it 'should be true on a table row'
      Expect tablemode#table#IsTable(2) to_be_true
      Expect tablemode#table#IsTable(4) to_be_true
      Expect tablemode#table#IsTable(5) to_be_true
    end

    it 'should be true when on a table border'
      Expect tablemode#table#IsTable(1) to_be_true
      Expect tablemode#table#IsTable(3) to_be_true
      Expect tablemode#table#IsTable(6) to_be_true
    end

    it 'should not be true when not on a table'
      Expect tablemode#table#IsTable(7) to_be_false
    end
  end

  describe 'IsHeader'
    before
      new
      normal! ggdG
      read t/fixtures/table/sample_with_header.txt
    end

    it 'should be true on the table header'
      Expect tablemode#table#IsHeader(2) to_be_true
    end

    it 'should be false anywhere else'
      Expect tablemode#table#IsHeader(1) to_be_false
      Expect tablemode#table#IsHeader(4) to_be_false
      Expect tablemode#table#IsHeader(5) to_be_false
      Expect tablemode#table#IsHeader(6) to_be_false
      Expect tablemode#table#IsHeader(7) to_be_false
    end
  end

  describe 'AddBorder'
    before
      new
      normal! ggdG
      read t/fixtures/table/sample_for_header.txt
    end

    it 'should add border to line'
      call tablemode#table#AddBorder(2)
      Expect tablemode#table#IsHeader(1) to_be_true
      Expect tablemode#table#IsBorder(2) to_be_true
    end

    describe 'for unicode'
      before
        new
        normal! ggdG
        read t/fixtures/table/sample_for_header_unicode.txt
      end

      it 'should add border to line'
        call tablemode#table#AddBorder(1)
        call tablemode#table#AddBorder(3)
        call tablemode#table#AddBorder(5)
        call tablemode#table#AddBorder(7)
        call tablemode#table#AddBorder(9)

        Expect tablemode#table#IsBorder(1) to_be_true
        Expect tablemode#utils#StrDisplayWidth(getline(1)) == tablemode#utils#StrDisplayWidth(getline(2))
        Expect tablemode#table#IsBorder(3) to_be_true
        Expect tablemode#utils#StrDisplayWidth(getline(3)) == tablemode#utils#StrDisplayWidth(getline(4))
        Expect tablemode#table#IsBorder(5) to_be_true
        Expect tablemode#utils#StrDisplayWidth(getline(5)) == tablemode#utils#StrDisplayWidth(getline(6))
        Expect tablemode#table#IsBorder(7) to_be_true
        Expect tablemode#utils#StrDisplayWidth(getline(7)) == tablemode#utils#StrDisplayWidth(getline(8))
        Expect tablemode#table#IsBorder(9) to_be_true
        Expect tablemode#utils#StrDisplayWidth(getline(9)) == tablemode#utils#StrDisplayWidth(getline(8))
      end
    end
  end

  describe 'Realign'
    describe 'without header alignments'
      describe 'for simple'
        before
          new
          normal! ggdG
          read t/fixtures/table/sample_realign_before.txt
        end

        it 'should be aligned properly'
          call tablemode#table#Realign(1)
          Expect getline(1,'$') == readfile('t/fixtures/table/sample_realign_after.txt')
        end
      end

      describe 'for unicode'
        before
          new
          normal! ggdG
          read t/fixtures/table/sample_realign_unicode_before.txt
        end

        it 'should be aligned properly'
          call tablemode#table#Realign(1)
          Expect getline(1,'$') == readfile('t/fixtures/table/sample_realign_unicode_after.txt')
        end
      end
    end

    describe 'with header alignments'
      describe 'for simple'
        before
          new
          normal! ggdG
          read t/fixtures/table/sample_header_realign_before.txt
        end

        it 'should be aligned properly'
          call tablemode#table#Realign(1)
          Expect getline(1,'$') == readfile('t/fixtures/table/sample_header_realign_after.txt')
        end
      end

      describe 'for unicode'
        before
          new
          normal! ggdG
          read t/fixtures/table/sample_header_realign_unicode_before.txt
        end

        it 'should be aligned properly'
          call tablemode#table#Realign(1)
          Expect getline(1,'$') == readfile('t/fixtures/table/sample_header_realign_unicode_after.txt')
        end
      end
    end
  end
end