require './parser' class QueryParserTester describe 'Testing the Parser' do before do @evaluator = Query.new end it 'tests query with only one search term without quotes and without column name' do @result = @evaluator.parse('-123') expect(@result[:DEFAULT_COLUMN]).to eq '-123' end it 'tests query with only one search term with quotes and without column name' do @result = @evaluator.parse('"OR 128"') expect(@result[:DEFAULT_COLUMN]).to eq '"OR 128"' end it 'tests query with one column and search term without quotes' do @result = @evaluator.parse('tag:mta') expect(@result['tag']).to eq 'mta' end it 'tests query with one column and search term with quotes' do @result = @evaluator.parse('tag:"tag 120"') expect(@result['tag']).to eq '"tag 120"' end it 'tests query with two columns connected with OR and search terms without quotes' do @result = @evaluator.parse('tag:mta OR tag:12') @expected_array = [ { 'tag' => 'mta' }, { 'tag' => '12' } ] expect(@result.count).to eq 1 expect(@result[:OPERATOR_OR]).to eq @expected_array end it 'tests query with two columns connected with OR and search terms with quotes' do @result = @evaluator.parse('tag:mta OR tag:"tag 12"') @expected_array = [ { 'tag' => 'mta' }, { 'tag' => '"tag 12"' } ] expect(@result.count).to eq 1 expect(@result[:OPERATOR_OR]).to eq @expected_array end it 'tests query with two columns connected with AND and search terms without quotes' do @result = @evaluator.parse('tag:mta AND tag:12') @expected_array = [ { 'tag' => 'mta' }, { 'tag' => '12' } ] expect(@result.count).to eq 1 expect(@result[:OPERATOR_AND]).to eq @expected_array end it 'tests query with two columns connected with AND and search terms with quotes' do @result = @evaluator.parse('tag:mta and tag:"tag 12"') @expected_array = [ { 'tag' => 'mta' }, { 'tag' => '"tag 12"' } ] expect(@result.count).to eq 1 expect(@result[:OPERATOR_AND]).to eq @expected_array end it 'tests simple query with brackets' do @result = @evaluator.parse('(123)') expect(@result.count).to eq 1 expect(@result[:DEFAULT_COLUMN]).to eq '123' end it 'tests simple query with brackets and with a column name' do @result = @evaluator.parse('(name:JF)') expect(@result.count).to eq 1 expect(@result['name']).to eq 'JF' end it 'tests query with OR operator in brackets' do @result = @evaluator.parse('(name:JF or tag:mta)') @expected_array = [ { 'name' => 'JF' }, { 'tag' => 'mta' } ] expect(@result.count).to eq 1 expect(@result[:OPERATOR_OR]).to eq @expected_array end it 'tests query with two simple brackets expressions' do @result = @evaluator.parse('(name:JF) and (-456)') @expected_array = [ { 'name' => 'JF' }, { :DEFAULT_COLUMN => '-456' } ] expect(@result.count).to eq 1 expect(@result[:OPERATOR_AND]).to eq @expected_array end it 'tests query with two brackets expressions' do @result = @evaluator.parse('(name:JF or tag:"tag 0") and (-456)') @expected_array_part_1 = [ { 'name' => 'JF' }, { 'tag' => '"tag 0"' } ] @expected_array_total = [ {:OPERATOR_OR => @expected_array_part_1}, {:DEFAULT_COLUMN => '-456'} ] expect(@result.count).to eq 1 expect(@result[:OPERATOR_AND]).to eq @expected_array_total end it 'tests operator precedence' do @result1 = @evaluator.parse('tag:mta or name:JF and 12_4') @result2 = @evaluator.parse('tag:mta or (name:JF and 12_4)') expect(@result1).to eq @result2 expect(@result1.length).to eq 1 @expected_array_part_2 = [ {'name' => 'JF'}, {:DEFAULT_COLUMN => '12_4'} ] @expected_array_total = [ {'tag' => 'mta'}, {:OPERATOR_AND => @expected_array_part_2} ] expect(@result1[:OPERATOR_OR]).to eq @expected_array_total end # Tests to write : # * query with multiple column names and search terms without logical operators # * AND NOT, OR NOT tests end end