# frozen_string_literal: true describe TextToTsquery do describe '.new' do # partial match it { expect(described_class.new('A').tsquery).to eq('A:*') } it { expect(described_class.new('A', wildcard: false).tsquery).to eq('A:') } it { expect(described_class.new(' A ').tsquery).to eq('A:*') } # AND operations it { expect(described_class.new('A B').tsquery).to eq('A:*&B:*') } it { expect(described_class.new('A B C').tsquery).to eq('A:*&B:*&C:*') } it { expect(described_class.new('A and B').tsquery).to eq('A:*&B:*') } it { expect(described_class.new('A AND B').tsquery).to eq('A:*&B:*') } it { expect(described_class.new('A & B').tsquery).to eq('A:*&B:*') } it { expect(described_class.new('A && B').tsquery).to eq('A:*&B:*') } it { expect(described_class.new('A & B && C and D AND E F').tsquery).to eq('A:*&B:*&C:*&D:*&E:*&F:*') } # OR operations it { expect(described_class.new('A or B').tsquery).to eq('A:*|B:*') } it { expect(described_class.new('A or B', wildcard: false).tsquery).to eq('A:|B:') } it { expect(described_class.new('A OR B').tsquery).to eq('A:*|B:*') } it { expect(described_class.new('A OR B', wildcard: false).tsquery).to eq('A:|B:') } it { expect(described_class.new('A | B').tsquery).to eq('A:*|B:*') } it { expect(described_class.new('A | B', wildcard: false).tsquery).to eq('A:|B:') } it { expect(described_class.new('A || B').tsquery).to eq('A:*|B:*') } it { expect(described_class.new('A || B', wildcard: false).tsquery).to eq('A:|B:') } it { expect(described_class.new('A or or B').tsquery).to eq('A:*|B:*') } it { expect(described_class.new('A or or B', wildcard: false).tsquery).to eq('A:|B:') } it { expect(described_class.new('A | B || C or D OR E').tsquery).to eq('A:*|B:*|C:*|D:*|E:*') } it { expect(described_class.new('A | B || C or D OR E', wildcard: false).tsquery).to eq('A:|B:|C:|D:|E:') } # () Precedence it { expect(described_class.new('(A)').tsquery).to eq('(A:*)') } it { expect(described_class.new('(A)', wildcard: false).tsquery).to eq('(A:)') } it { expect(described_class.new('(A B)').tsquery).to eq('(A:*&B:*)') } it { expect(described_class.new('(A B)', wildcard: false).tsquery).to eq('(A:&B:)') } it { expect(described_class.new('A (B !C)').tsquery).to eq('A:*&(B:*&!C)') } it { expect(described_class.new('A (B !C)', wildcard: false).tsquery).to eq('A:&(B:&!C)') } it { expect(described_class.new('(A AND B) OR C').tsquery).to eq('(A:*&B:*)|C:*') } it { expect(described_class.new('(A AND B) OR C', wildcard: false).tsquery).to eq('(A:&B:)|C:') } it { expect(described_class.new('A AND (B OR C)').tsquery).to eq('A:*&(B:*|C:*)') } it { expect(described_class.new('A AND (B OR C)', wildcard: false).tsquery).to eq('A:&(B:|C:)') } it { expect(described_class.new('(A & B) || C').tsquery).to eq('(A:*&B:*)|C:*') } it { expect(described_class.new('(A & B) || C', wildcard: false).tsquery).to eq('(A:&B:)|C:') } it { expect(described_class.new('A && (B | C)').tsquery).to eq('A:*&(B:*|C:*)') } it { expect(described_class.new('A && (B | C)', wildcard: false).tsquery).to eq('A:&(B:|C:)') } it { expect(described_class.new('A && !D (B | C | !E)').tsquery).to eq('A:*&!D&(B:*|C:*|!E)') } it { expect(described_class.new('A && !D (B | C | !E)', wildcard: false).tsquery).to eq('A:&!D&(B:|C:|!E)') } # Exact Matches it { expect(described_class.new('"A"').tsquery).to eq("'A'") } it { expect(described_class.new('"A B"').tsquery).to eq("'A B'") } it { expect(described_class.new('"A&B"').tsquery).to eq("'A&B'") } it { expect(described_class.new('"-A|B"').tsquery).to eq("'-A|B'") } it { expect(described_class.new('"A-B"').tsquery).to eq("'A-B'") } it { expect(described_class.new('"A" B').tsquery).to eq("'A'&B:*") } it { expect(described_class.new('"A" B', wildcard: false).tsquery).to eq("'A'&B:") } it { expect(described_class.new('"A B" C').tsquery).to eq("'A B'&C:*") } it { expect(described_class.new('"A B" C', wildcard: false).tsquery).to eq("'A B'&C:") } it { expect(described_class.new('("A B" or C) and D').tsquery).to eq("('A B'|C:*)&D:*") } it { expect(described_class.new('("A B" or C) and D', wildcard: false).tsquery).to eq("('A B'|C:)&D:") } describe 'validations' do it { expect { described_class.new('(') }.to raise_error(ArgumentError, /parenthesis/) } end end describe '.valid_search_parenthesis?' do it { expect(described_class.valid_search_parenthesis?('')).to eq true } it { expect(described_class.valid_search_parenthesis?('()')).to eq true } it { expect(described_class.valid_search_parenthesis?('()()')).to eq true } it { expect(described_class.valid_search_parenthesis?('(()())')).to eq true } it { expect(described_class.valid_search_parenthesis?('((())())')).to eq true } it { expect(described_class.valid_search_parenthesis?('(')).to eq false } it { expect(described_class.valid_search_parenthesis?(')(')).to eq false } it { expect(described_class.valid_search_parenthesis?('())')).to eq false } it { expect(described_class.valid_search_parenthesis?('((()())')).to eq false } end end