# coding: utf-8 require 'helper' module BibTeX class NamesTest < MiniTest::Spec before do @poe = Name.new(:first => 'Edgar Allen', :last => 'Poe') end describe 'string behaviour' do before do @name = Name.new(:first => 'Charles Louis Xavier Joseph', :prefix => 'de la', :last => 'Vallee Poussin', :suffix => 'Jr.') end it 'should implement upcase!' do assert_equal 'DE LA VALLEE POUSSIN, JR., CHARLES LOUIS XAVIER JOSEPH', @name.upcase!.to_s end it 'should implement downcase!' do assert_equal 'de la vallee poussin, jr., charles louis xavier joseph', @name.downcase!.to_s end it 'should implement gsub!' do assert_equal 'dX la VallXX PoussXn, Jr., CharlXs LouXs XavXXr JosXph', @name.gsub!(/[ei]/, 'X').to_s end end describe '#display_order' do it 'returns the name as "first last"' do @poe.display_order.must_be :==, 'Edgar Allen Poe' end it 'accepts the :initials option' do @poe.display_order(:initials => true).must_be :==, 'E.A. Poe' end end describe '#sort_order' do it 'returns the name as "last, first"' do @poe.sort_order.must_be :==, 'Poe, Edgar Allen' end it 'accepts the :initials option' do @poe.sort_order(:initials => true).must_be :==, 'Poe, E.A.' end end describe '#initials?' do it 'returns true if the name contains a solely initials as a first name' do @poe.initials?.must_equal false @poe.first = 'Edgar A.' @poe.initials?.must_equal false @poe.first = 'E.A.' @poe.initials?.must_equal true @poe.first = '' @poe.initials?.must_equal false @poe.first = nil @poe.initials?.must_equal false end end describe '#rename_if' do it 'renames the name to the given attributes if no condition is given' do @poe.rename_if({ :first => 'E.A.' }).first.must_equal 'E.A.' end it 'renames the name to the given attributes if all conditions match' do @poe.rename_if({ :first => 'E.A.' }, { :last => @poe.last }).first.must_equal 'E.A.' @poe.rename_if({ :first => 'E.A.' }, { :last => @poe.last, :first => @poe.first }).first.must_equal 'E.A.' end it 'renames the name to the given attributes if the block returns true' do @poe.rename_if({ :first => 'E.A.' }) {|n| true}.first.must_equal 'E.A.' end it 'does not rename the name to the given attributes if at least one condition does not match' do @poe.rename_if({ :first => 'E.A.' }, { :last => 'foo' }).first.wont_equal 'E.A.' @poe.rename_if({ :first => 'E.A.' }, { :last => 'foo', :first => @poe.first }).first.wont_equal 'E.A.' @poe.rename_if({ :first => 'E.A.' }, { :last => @poe.last, :first => 'foo' }).first.wont_equal 'E.A.' end it 'does not rename the name to the given attributes if the block returns false' do @poe.rename_if({ :first => 'E.A.' }) {|n| false}.first.wont_equal 'E.A.' end end describe '#extend_initials' do it 'extends the first name if the last name and initials match' do Name.new(:first => 'E.A.', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen' Name.new(:first => 'Edgar A.', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen' Name.new(:first => 'E. A.', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen' Name.new(:first => 'E. Allen', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.must_equal 'Edgar Allen' Name.new(:first => 'E.A.', :last => 'Poe').extend_initials('Edgar A.', 'Poe').first.must_equal 'Edgar A.' end it 'does not extend the first name if the last name or initials do not match' do Name.new(:first => 'E.A.', :last => 'Poe').extend_initials('Edgar Allen', 'Poser').first.wont_equal 'Edgar Allen' Name.new(:first => 'E.A.', :last => 'Poe').extend_initials('Edgar Ellen', 'Poe').first.wont_equal 'Edgar Ellen' Name.new(:first => 'E.R.', :last => 'Poe').extend_initials('Edgar Allen', 'Poe').first.wont_equal 'Edgar Allen' end end describe "conversions" do before do class UpcaseAll < BibTeX::Filter def apply (value) value.upcase end end end describe "#convert" do it "converts the value when given a filter instance" do Names.parse('Poe and Hawthorne').convert(UpcaseAll.instance).to_s.must_be :==, 'POE and HAWTHORNE' end it "converts LaTeX umlauts" do Names.parse("S{\\o}ren Kirkegaard and Emmanuel L\\'evinas").convert(:latex).to_s.must_be :==, 'Kirkegaard, Søren and Lévinas, Emmanuel' end end end end end