# frozen_string_literal: true

require 'test_helper'

module Vedeu

  module Renderers

    describe HTML do

      let(:described)  { Vedeu::Renderers::HTML }
      let(:instance)   { described.new(options) }
      let(:options)    {
        {
          compression:   compression,
          end_tag:       end_tag,
          end_row_tag:   end_row_tag,
          filename:      filename,
          output:        output,
          start_tag:     start_tag,
          start_row_tag: start_row_tag,
          template:      template,
          timestamp:     timestamp,
          write_file:    write_file,
        }
      }
      let(:compression)   { false }
      let(:end_tag)       { '</td>' }
      let(:end_row_tag)   { '</tr>' }
      let(:filename)      { 'vedeu_renderers_html' }
      let(:output)        { '' }
      let(:start_tag)     { '<td' }
      let(:start_row_tag) { '<tr>' }
      let(:template)      {
        ::File.dirname(__FILE__) + '/../../../support/templates/' \
        'html_renderer.vedeu'
      }
      let(:timestamp)     { false }
      let(:write_file)    { false }

      before do
        Vedeu.config.stubs(:compression?).returns(false)
        ::File.stubs(:write)
        Vedeu.stubs(:height).returns(2)
        Vedeu.stubs(:width).returns(4)
        Vedeu::Buffers::Terminal.reset!
      end

      describe '#initialize' do
        it { instance.must_be_instance_of(described) }
        it { instance.instance_variable_get('@options').must_equal(options) }
      end

      describe '#clear' do
        subject { instance.clear }

        it { subject.must_be_instance_of(String) }
        it { subject.must_equal('') }
      end

      describe '#render' do
        let(:output) {
          Vedeu::Models::Page.coerce([
            Vedeu::Cells::Char.new(value: 'a',
                                   colour: {
                                     background: '#ff0000',
                                     foreground: '#ffffff' }),
          ])
        }
        let(:expected) {
          "<html>\n" \
          "  <head>\n" \
          "    <style type='text/css'>\n" \
          "      body {\n" \
          "        background:#000;\n" \
          "      }\n" \
          "      td {\n" \
          "        border:1px #171717 solid;\n" \
          "        font-size:12px;\n" \
          "        font-family:monospace;\n" \
          "        height:18px;\n" \
          "        margin:1px;\n" \
          "        text-align:center;\n" \
          "        vertical-align:center;\n" \
          "        width:18px;\n" \
          "      }\n" \
          "    </style>\n" \
          "  </head>\n" \
          "  <body>\n" \
          "    <table>\n" \
          "      <tr>\n" \
          "<td style='background-color:#ff0000;color:#ffffff;'>" \
          "a" \
          "</td></tr>\n" \
          "    </table>\n" \
          "  </body>\n" \
          "</html>\n"
        }

        subject { instance.render(output) }

        it { subject.must_be_instance_of(String) }
        it { subject.must_equal(expected) }
      end

      describe '#html_body' do
        let(:output) {
          Vedeu::Models::Page.coerce([
            Vedeu::Cells::Char.new(value: 'a',
                                   colour: {
                                     background: '#ff0000',
                                     foreground: '#ffffff' }),
          ])
        }
        let(:expected) {
          "<tr>\n" \
          "<td style='background-color:#ff0000;color:#ffffff;'>" \
          "a" \
          "</td></tr>\n" \
        }

        before do
          instance.instance_variable_set('@output', output)
        end

        subject { instance.html_body }

        it { subject.must_equal(expected) }
      end

    end # HTML

  end # Renderers

end # Vedeu