81 lines
5.1 KiB
Ruby
81 lines
5.1 KiB
Ruby
# 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
|