### Question:
DatatypeMatch extends AbstractMatcher<String, String> { @Override public boolean match(String offer, String requirement, List<MatchingResultMessage> errorLog) { boolean match = MatchingUtils.nullCheckReqAllowed(offer, requirement) || requirement.equals(offer) || subClassOf(offer, requirement) || MatchingUtils.nullCheck(offer, requirement); if (!match) buildErrorMessage(errorLog, requirement); return match; } DatatypeMatch(); @Override boolean match(String offer, String requirement, List<MatchingResultMessage> errorLog);  }### Answer:
@Test public void testPositiveDatatypeMatch() { String offer = XSD._integer.toString(); String requirement = XSD._integer.toString(); List<MatchingResultMessage> errorLog = new ArrayList<>(); boolean matches = new DatatypeMatch().match(offer, requirement, errorLog); assertTrue(matches); }
@Test public void testNegativeDatatypeMatch() { String offer = XSD._integer.toString(); String requirement = XSD._string.toString(); List<MatchingResultMessage> errorLog = new ArrayList<>(); boolean matches = new DatatypeMatch().match(offer, requirement, errorLog); assertFalse(matches); }
@Test public void testSubPropertyMatch() { String offer = XSD._integer.toString(); String requirement = SO.Number; List<MatchingResultMessage> errorLog = new ArrayList<>(); boolean matches = new DatatypeMatch().match(offer, requirement, errorLog); assertTrue(matches); }