require 'spec_helper'

describe RequestLogAnalyzer::FileFormat do

  describe '.format_definition' do

    before(:each) do
      @first_file_format  = Class.new(RequestLogAnalyzer::FileFormat::Base)
      @second_file_format = Class.new(RequestLogAnalyzer::FileFormat::Base)
    end

    it 'should specify line definitions directly within the file_format' do
      @first_file_format.format_definition.direct_test regexp: /test/
      @first_file_format.should have_line_definition(:direct_test)
    end

    it 'specify lines with a block for the format definition' do
      @first_file_format.format_definition do |format|
        format.block_test regexp: /test (\w+)/, captures: [{ name: :tester, type: :string }]
      end

      @first_file_format.should have_line_definition(:block_test).capturing(:tester)
    end

    it 'should specify a line with a block' do
      @first_file_format.format_definition.hash_test do |line|
        line.regexp   = /test/
        line.captures = []
      end

      @first_file_format.should have_line_definition(:hash_test)
    end

    it 'should define lines only for its own language' do
      @first_file_format.format_definition.first regexp: /test 123/
      @second_file_format.format_definition.second regexp: /test 456/

      @first_file_format.should have_line_definition(:first)
      @first_file_format.should_not have_line_definition(:second)
      @second_file_format.should_not have_line_definition(:first)
      @second_file_format.should have_line_definition(:second)
    end
  end

  describe '.load' do

    it 'should return an instance of a FileFormat class' do
      @file_format = RequestLogAnalyzer::FileFormat.load(TestingFormat)
      @file_format.should be_kind_of(TestingFormat)
    end

    it 'should return itself if it already is a FileFormat::Base instance' do
      @file_format = RequestLogAnalyzer::FileFormat.load(testing_format)
      @file_format.should be_kind_of(TestingFormat)
    end

    it 'should load a predefined file format from the /file_format dir' do
      @file_format = RequestLogAnalyzer::FileFormat.load(:rails)
      @file_format.should be_kind_of(RequestLogAnalyzer::FileFormat::Rails)
    end

    it 'should load a provided format file' do
      format_filename = File.expand_path('../../lib/testing_format.rb', File.dirname(__FILE__))
      @file_format = RequestLogAnalyzer::FileFormat.load(format_filename)
      @file_format.should be_kind_of(TestingFormat)
    end

  end
end