require 'spec_helper'

describe 'custom delimiters' do
  after(:each) do
    Picky::Query::Token.partial_character = '*'
    Picky::Query::Token.no_partial_character = '"'
    Picky::Query::Token.similar_character = '~'
    Picky::Query::Token.no_similar_character = '"'
    Picky::Query::Token.range_character = '…'
    Picky::Query::Token.qualifier_text_delimiter = /:/
    Picky::Query::Token.qualifiers_delimiter = /,/
  end

  context 'offers custom partial delimiters to be set' do
    let(:index) do
      index = Picky::Index.new :custom_delimiters do
        category :text1
        category :text2
      end

      index.add Struct.new(:id, :text1, :text2).new(1, 'hello', 'world')

      index
    end
    let(:try) { Picky::Search.new index }

    it { try.search('hell world').ids.should == [] }
    it { try.search('hell* world').ids.should == [1] }
    it { try.search('hello world').ids.should == [1] }

    it 'with changed partial character' do
      try.search('hell! world').ids.should
      Picky::Query::Token.partial_character = '!'
      try.search('hell! world').ids.should == [1]
    end

    it 'with changed no-partial character' do
      try.search('hell!" world').ids.should
      Picky::Query::Token.no_partial_character = '\?'
      try.search('hell!? world').ids.should == []
    end
  end

  it 'offers custom similar delimiters to be set' do
    index = Picky::Index.new :custom_delimiters do
      category :text1, similarity: Picky::Similarity::Soundex.new
      category :text2
    end

    index.add Struct.new(:id, :text1, :text2).new(1, 'hello', 'world')

    try = Picky::Search.new index
    try.search('hell world').ids.should
    try.search('hell~ world').ids.should
    try.search('hello world').ids.should

    try.search('hell? world').ids.should
    Picky::Query::Token.similar_character = '\?'
    try.search('hell? world').ids.should
    Picky::Query::Token.no_similar_character = '!'
    try.search('hello?! world!').ids.should

    try.search('hell?" world').ids.should
    Picky::Query::Token.no_partial_character = '\#'
    try.search('hello?# world#').ids.should == [1]
  end

  it 'offers custom qualifiers delimiters to be set' do
    index = Picky::Index.new :custom_delimiters do
      category :text1, similarity: Picky::Similarity::Soundex.new
      category :text2
    end

    index.add Struct.new(:id, :text1, :text2).new(1, 'hello world', 'world')

    try = Picky::Search.new index
    try.search('text1:hello text2:world').ids.should

    try.search('text1?hello text2?world').ids.should
    Picky::Query::Token.qualifier_text_delimiter = /\?/
    try.search('text1?hello text2?world').ids.should

    try.search('text1!text2?hello text2?world').ids.should
    Picky::Query::Token.qualifiers_delimiter = /!/
    try.search('text1!text2?hello text2?world').ids.should == [1]
  end

  it 'offers custom range characters to be set' do
    index = Picky::Index.new :custom_range_character do
      category :year
    end

    rangy = Struct.new :id, :year

    index.add rangy.new(1, 1977)
    index.add rangy.new(2, 1989)
    index.add rangy.new(3, 2001)
    index.add rangy.new(4, 2012)
    index.add rangy.new(4, 3000)

    try = Picky::Search.new index
    try.search('1980…2015').ids.should

    try.search('1980-2015').ids.should
    Picky::Query::Token.range_character = '-'
    try.search('1980-2015').ids.should == [2, 3, 4]
  end
end
