/* * Copyright 2016 Christoph Böhme * * Licensed under the Apache License, Version 2.0 the "License"; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.culturegraph.mf.biblio.iso2709; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.never; import java.nio.charset.Charset; import org.culturegraph.mf.framework.FormatException; import org.junit.Before; import org.junit.Test; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; /** * Tests for class {@link Record}. * * @author Christoph Böhme */ public class RecordTest { @Mock private FieldHandler fieldHandler; private Record record; @Before public void initMocks() { MockitoAnnotations.initMocks(this); } @Test public void constructor_shouldCreateRecordInstance() { final byte[] data = asBytes("00026SIMPL1200025SYS345R\u001e\u001d"); record = new Record(data); assertNotNull(record); } @Test(expected = FormatException.class) public void constructor_shouldThrowFormatExceptionIfSizeOfRecordDataIsLessThanMinRecordLength() { final byte[] data = asBytes("00005"); record = new Record(data); // Exception expected } @Test public void getIdentifier_shouldReturnRecordIdentifier() { final byte[] data = asBytes("00034SIMPL0000030SYS110R" + "00120\u001e" + "ID\u001e\u001d"); record = new Record(data); assertEquals("ID", record.getRecordId()); } @Test public void getIdentifier_shouldReturnNullIfRecordHasNoIdentifier() { final byte[] data = asBytes("00034SIMPL0000030SYS110R" + "00220\u001e" + "XY\u001e\u001d"); record = new Record(data); assertNull(record.getRecordId()); } @Test public void processFields_shouldCallHandlerReferenceFieldForReferenceFields() { final byte[] data = asBytes("00042SIMPL0000035SYS110R" + "00120" + "00223\u001e" + "ID\u001e" + "XY\u001e\u001d"); record = new Record(data); record.processFields(fieldHandler); final InOrder ordered = inOrder(fieldHandler); ordered.verify(fieldHandler).referenceField(asChars("001"), asChars(""), "ID"); ordered.verify(fieldHandler).referenceField(asChars("002"), asChars(""), "XY"); } @Test public void processFields_shouldHandleDataFieldsInRecordWithoutIndicatorsAndIdentifiers() { final byte[] data = asBytes("00044SIMPL0000037SYS111R" + "01120X" + "01223Y\u001e" + "F1\u001e" + "F2\u001e\u001d"); record = new Record(data); record.processFields(fieldHandler); final InOrder ordered = inOrder(fieldHandler); ordered.verify(fieldHandler).startDataField(asChars("011"), asChars("X"), asChars("")); ordered.verify(fieldHandler).data(asChars(""), "F1"); ordered.verify(fieldHandler).endDataField(); ordered.verify(fieldHandler).startDataField(asChars("012"), asChars("Y"), asChars("")); ordered.verify(fieldHandler).data(asChars(""), "F2"); ordered.verify(fieldHandler).endDataField(); } @Test public void processFields_shouldHandleDataFieldsInRecordWithIndicatorsButWithoutIdentifiers() { final byte[] data = asBytes("00044SIMPL1000035SYS110R" + "01130" + "01234\u001e" + "XF1\u001e" + "YF2\u001e\u001d"); record = new Record(data); record.processFields(fieldHandler); final InOrder ordered = inOrder(fieldHandler); ordered.verify(fieldHandler).startDataField(asChars("011"), asChars(""), asChars("X")); ordered.verify(fieldHandler).data(asChars(""), "F1"); ordered.verify(fieldHandler).endDataField(); ordered.verify(fieldHandler).startDataField(asChars("012"), asChars(""), asChars("Y")); ordered.verify(fieldHandler).data(asChars(""), "F2"); ordered.verify(fieldHandler).endDataField(); } @Test public void processFields_shouldHandleDataFieldsInRecordWithoutIndicatorsButWithTwoOctetIdentifiers() { final byte[] data = asBytes("00050SIMPL0200035SYS110R" + "01150" + "01295\u001e" + "\u001fXF1\u001e" + "\u001fYF2\u001fZF3\u001e\u001d"); record = new Record(data); record.processFields(fieldHandler); final InOrder ordered = inOrder(fieldHandler); ordered.verify(fieldHandler).startDataField(asChars("011"), asChars(""), asChars("")); ordered.verify(fieldHandler).data(asChars("X"), "F1"); ordered.verify(fieldHandler).endDataField(); ordered.verify(fieldHandler).startDataField(asChars("012"), asChars(""), asChars("")); ordered.verify(fieldHandler).data(asChars("Y"), "F2"); ordered.verify(fieldHandler).data(asChars("Z"), "F3"); ordered.verify(fieldHandler).endDataField(); } @Test public void processFields_shouldHandleDataFieldsInRecordWithoutIndicatorsButWithOneOctetIdentifiers() { final byte[] data = asBytes("00038SIMPL0100030SYS110R" + "01170\u001e" + "\u001fF1\u001fF2\u001e\u001d"); record = new Record(data); record.processFields(fieldHandler); final InOrder ordered = inOrder(fieldHandler); ordered.verify(fieldHandler).startDataField(asChars("011"), asChars(""), asChars("")); ordered.verify(fieldHandler).data(asChars(""), "F1"); ordered.verify(fieldHandler).data(asChars(""), "F2"); ordered.verify(fieldHandler).endDataField(); } @Test public void processFields_shouldHandleEmptyDataFieldInRecordWithoutIndicatorsButWithIdentifiers() { final byte[] data = asBytes("00032SIMPL0200030SYS110R" + "01110\u001e" + "\u001e\u001d"); record = new Record(data); record.processFields(fieldHandler); final InOrder ordered = inOrder(fieldHandler); ordered.verify(fieldHandler).startDataField(asChars("011"), asChars(""), asChars("")); ordered.verify(fieldHandler, never()).data(any(char[].class), any(String.class)); ordered.verify(fieldHandler).endDataField(); } @Test public void processFields_shouldHandleDataFieldsWithoutContentInRecordWithoutIndicatorsButWithIdentifiers() { final byte[] data = asBytes("00036SIMPL0200030SYS110R" + "01150\u001e" + "\u001fX\u001fY\u001e\u001d"); record = new Record(data); record.processFields(fieldHandler); final InOrder ordered = inOrder(fieldHandler); ordered.verify(fieldHandler).startDataField(asChars("011"), asChars(""), asChars("")); ordered.verify(fieldHandler).data(asChars("X"), ""); ordered.verify(fieldHandler).data(asChars("Y"), ""); ordered.verify(fieldHandler).endDataField(); } @Test public void processFields_shouldHandleDataFieldsInRecordWithIndicatorsAndOctetIdentifiers() { final byte[] data = asBytes("00051SIMPL2200035SYS110R" + "01160" + "01296\u001e" + "AB\u001fX1\u001e" + "CD\u001fY2\u001fZ3\u001e" + "\u001d"); record = new Record(data); record.processFields(fieldHandler); final InOrder ordered = inOrder(fieldHandler); ordered.verify(fieldHandler).startDataField(asChars("011"), asChars(""), asChars("AB")); ordered.verify(fieldHandler).data(asChars("X"), "1"); ordered.verify(fieldHandler).endDataField(); ordered.verify(fieldHandler).startDataField(asChars("012"), asChars(""), asChars("CD")); ordered.verify(fieldHandler).data(asChars("Y"), "2"); ordered.verify(fieldHandler).data(asChars("Z"), "3"); ordered.verify(fieldHandler).endDataField(); } @Test public void processFields_shouldConcatenateContinuedReferenceFieldsAndReportAllImplDefinedParts() { final byte[] data = asBytes("00062SIMPL0000046SYS121R" + "001000A" + "001309B" + "002312C\u001e" + "abcdefghijk\u001e" + "XY\u001e\u001d"); record = new Record(data); record.processFields(fieldHandler); final InOrder ordered = inOrder(fieldHandler); ordered.verify(fieldHandler).referenceField(asChars("001"), asChars("A"), "abcdefghijk"); ordered.verify(fieldHandler).additionalImplDefinedPart(asChars("B")); ordered.verify(fieldHandler).referenceField(asChars("002"), asChars("C"), "XY"); } @Test public void processFields_shouldConcatenateContinuedFieldsAndReportAllImplDefinedParts() { final byte[] data = asBytes("00062SIMPL0000046SYS121R" + "011000A" + "011309B" + "012312C\u001e" + "abcdefghijk\u001e" + "XY\u001e\u001d"); record = new Record(data); record.processFields(fieldHandler); final InOrder ordered = inOrder(fieldHandler); ordered.verify(fieldHandler).startDataField(asChars("011"), asChars("A"), asChars("")); ordered.verify(fieldHandler).data(asChars(""), "abcdefghijk"); ordered.verify(fieldHandler).endDataField(); ordered.verify(fieldHandler).additionalImplDefinedPart(asChars("B")); ordered.verify(fieldHandler).startDataField(asChars("012"), asChars("C"), asChars("")); ordered.verify(fieldHandler).data(asChars(""), "XY"); ordered.verify(fieldHandler).endDataField(); } private static byte[] asBytes(final String str) { return str.getBytes(Charset.forName("UTF-8")); } private static char[] asChars(final String str) { return str.toCharArray(); } }