def stanford_mods_imprint(smods_rec)
Stanford::Mods::Imprint.new(smods_rec.origin_info)
end
# unit / functional tests for imprint class
describe Stanford::Mods::Imprint do
let(:smods_rec) { Stanford::Mods::Record.new }
let(:mods_origin_info_start_str) { "" }
let(:mods_origin_info_end_str) { '' }
describe 'date processing' do
describe '#publication_date_for_slider' do
{
'' => [],
'unparsable' => [],
'1957' => [1957],
'195u' => (1950..1959).to_a,
'1964195u' => [1964],
'1964195u' => [1964],
'195u1964' => (1950..1964).to_a,
'1964195u' => [1964] + (1950..1959).to_a
}.each do |example, expected|
it 'works' do
smods_rec.from_str("#{mods_origin_info_start_str}
#{example}
#{mods_origin_info_end_str}")
imprint = stanford_mods_imprint(smods_rec)
expect(imprint.publication_date_for_slider).to eq expected
end
end
end
describe 'bad dates' do
it 'ignores bad date values' do
smods_rec.from_str(mods_origin_info_start_str +
'
Spain
9999
uuuu
0000-00-00
' +
mods_origin_info_end_str)
imprint_strs = stanford_mods_imprint(smods_rec).imprint_statements
expect(imprint_strs).to eq(['Spain'])
end
it 'handles invalid dates by returning the original value' do
smods_rec.from_str(mods_origin_info_start_str +
'1920-09-00' +
mods_origin_info_end_str)
imprint_strs = stanford_mods_imprint(smods_rec).imprint_statements
expect(imprint_strs.first).to match('1920-09-00')
end
end
context '#process_decade_century_dates' do
it 'calls process_decade_date for each element in passed nodeset that matches decade str' do
smods_rec.from_str("#{mods_origin_info_start_str}
before 195x after
1950s not a match
before 17-- after
not a match
another 165x match
#{mods_origin_info_end_str}")
imp = stanford_mods_imprint(smods_rec)
dt_elements = smods_rec.origin_info.dateIssued
expect(imp).to receive(:date_is_decade?).and_return(true, false, false, false, true)
expect(imp).to receive(:process_decade_date).twice
expect(imp).to receive(:date_is_century?).and_return(false, true, false)
expect(imp).to receive(:process_century_date)
imp.send(:process_decade_century_dates, dt_elements)
end
end
context 'date_is_decade?' do
['156u',
'167-?]',
'[171-?]',
'[189-]',
'ca.170-?]',
'200-?]',
'186?',
'195x',
'before 195x after'
].each do |example|
it 'true when decade string to change' do
smods_rec.from_str("#{mods_origin_info_start_str}
#{example}
#{mods_origin_info_end_str}")
imp = stanford_mods_imprint(smods_rec)
element = smods_rec.origin_info.dateIssued.first
expect(imp.send(:date_is_decade?, element)).to be_truthy
end
end
['1950s',
"1950's",
'before 1950s after'
].each do |example|
it 'false when no decade string to change' do
smods_rec.from_str("#{mods_origin_info_start_str}
#{example}
#{mods_origin_info_end_str}")
imp = stanford_mods_imprint(smods_rec)
element = smods_rec.origin_info.dateIssued.first
expect(imp.send(:date_is_decade?, element)).to be_falsey
end
end
end
context '#process_decade_date' do
{
'1950s' => '1950s',
"1950's" => "1950's",
'156u' => '1560s',
'167-?]' => '1670s?]',
'[171-?]' => '[1710s?]',
'[189-]' => '[1890s]',
'ca.170-?]' => 'ca.1700s?]',
'200-?]' => '2000s?]',
'186?' => '1860s',
'195x' => '1950s',
'early 1890s' => 'early 1890s',
'before 195x after' => 'before 1950s after'
}.each do |example, expected|
it "#{expected} for #{example}" do
smods_rec.from_str("#{mods_origin_info_start_str}
#{example}
#{mods_origin_info_end_str}")
imp = stanford_mods_imprint(smods_rec)
updated_element = imp.send(:process_decade_date, smods_rec.origin_info.dateIssued.first)
expect(updated_element.text).to eq expected
end
end
it 'leaves text alone when date str but no decade' do
smods_rec.from_str("#{mods_origin_info_start_str}
I think July 15, 1965 was a great day
#{mods_origin_info_end_str}")
imp = stanford_mods_imprint(smods_rec)
updated_element = imp.send(:process_decade_date, smods_rec.origin_info.dateIssued.first)
expect(updated_element.text).to eq 'I think July 15, 1965 was a great day'
end
it 'leaves text alone when no date str' do
smods_rec.from_str("#{mods_origin_info_start_str}
ain't no date heah
#{mods_origin_info_end_str}")
imp = stanford_mods_imprint(smods_rec)
updated_element = imp.send(:process_decade_date, smods_rec.origin_info.dateIssued.first)
expect(updated_element.text).to eq "ain't no date heah"
end
end
context 'date_is_century?' do
['17uu',
'17--?',
'before [16--] after'
].each do |example|
it 'true when century string to change' do
smods_rec.from_str("#{mods_origin_info_start_str}
#{example}
#{mods_origin_info_end_str}")
imp = stanford_mods_imprint(smods_rec)
element = smods_rec.origin_info.dateIssued.first
expect(imp.send(:date_is_century?, element)).to be_truthy
end
end
['18th century CE',
"before 5th century after"
].each do |example|
it 'false when no century string to change' do
smods_rec.from_str("#{mods_origin_info_start_str}
#{example}
#{mods_origin_info_end_str}")
imp = stanford_mods_imprint(smods_rec)
element = smods_rec.origin_info.dateIssued.first
expect(imp.send(:date_is_century?, element)).to be_falsey
end
end
end
context '#process_century_date' do
{
'18th century CE' => '18th century CE',
'17uu' => '18th century',
'17--?]' => '18th century?]',
'17--]' => '18th century]',
'[17--]' => '[18th century]',
'[17--?]' => '[18th century?]',
'before 16uu after' => 'before 17th century after'
}.each do |example, expected|
it "#{expected} for #{example}" do
smods_rec.from_str("#{mods_origin_info_start_str}
#{example}
#{mods_origin_info_end_str}")
imp = stanford_mods_imprint(smods_rec)
updated_element = imp.send(:process_century_date, smods_rec.origin_info.dateIssued.first)
expect(updated_element.text).to eq expected
end
end
it 'leaves text alone when date str but no century' do
smods_rec.from_str("#{mods_origin_info_start_str}
I think July 15, 1965 was a great day
#{mods_origin_info_end_str}")
imp = stanford_mods_imprint(smods_rec)
updated_element = imp.send(:process_century_date, smods_rec.origin_info.dateIssued.first)
expect(updated_element.text).to eq 'I think July 15, 1965 was a great day'
end
it 'leaves text alone when no date str' do
smods_rec.from_str("#{mods_origin_info_start_str}
ain't no date heah
#{mods_origin_info_end_str}")
imp = stanford_mods_imprint(smods_rec)
updated_element = imp.send(:process_century_date, smods_rec.origin_info.dateIssued.first)
expect(updated_element.text).to eq "ain't no date heah"
end
end
end
describe 'punctuation' do
it 'does not duplicate punctuation when end of element value matches the joining punct.' do
smods_rec.from_str(mods_origin_info_start_str +
'
San Francisco :
Chronicle Books,
2015.' +
mods_origin_info_end_str)
imprint_strs = stanford_mods_imprint(smods_rec).imprint_statements
expect(imprint_strs).to eq ['San Francisco : Chronicle Books, 2015.']
end
end
describe 'place processing' do
it 'uses type text instead of type code when avail' do
smods_rec.from_str(mods_origin_info_start_str +
'
ne
[Amsterdam]
' +
mods_origin_info_end_str)
imprint_strs = stanford_mods_imprint(smods_rec).imprint_statements
expect(imprint_strs).to eq ['[Amsterdam]']
end
it "translates encoded place if there isn't a text (or non-typed) value available" do
smods_rec.from_str(mods_origin_info_start_str +
'
ne
' +
mods_origin_info_end_str)
imprint_strs = stanford_mods_imprint(smods_rec).imprint_statements
expect(imprint_strs).to eq ['Netherlands']
end
it "ignores 'xx' country code" do
smods_rec.from_str(mods_origin_info_start_str +
'
xx
1994' +
mods_origin_info_end_str)
imprint_strs = stanford_mods_imprint(smods_rec).imprint_statements
expect(imprint_strs).to eq(['1994'])
end
end
end