From 75448022dd4eb5e847405d11c5477295006b4e4f Mon Sep 17 00:00:00 2001 From: Claudio Maggioni Date: Wed, 8 Mar 2023 11:38:11 +0100 Subject: [PATCH] graded assignment 2a done (with assumption on JaCoCo) --- SQ-2021-A4/pom.xml | 137 ++++++++++++++++++ .../usi/sq/util/numbers/INumberChecker.java | 35 +++++ .../usi/sq/util/numbers/NumberChecker.java | 62 ++++++++ ...mberCheckerBasicConditionCoverageTest.java | 18 +++ .../NumberCheckerBranchCoverageTest.java | 70 +++++++++ .../sq/util/numbers/NumberCheckerFactory.java | 7 + .../NumberCheckerMCDCCoverageTest.java | 19 +++ 7 files changed, 348 insertions(+) create mode 100644 SQ-2021-A4/pom.xml create mode 100644 SQ-2021-A4/src/main/java/org/usi/sq/util/numbers/INumberChecker.java create mode 100644 SQ-2021-A4/src/main/java/org/usi/sq/util/numbers/NumberChecker.java create mode 100644 SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerBasicConditionCoverageTest.java create mode 100644 SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerBranchCoverageTest.java create mode 100644 SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerFactory.java create mode 100644 SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerMCDCCoverageTest.java diff --git a/SQ-2021-A4/pom.xml b/SQ-2021-A4/pom.xml new file mode 100644 index 0000000..6251cad --- /dev/null +++ b/SQ-2021-A4/pom.xml @@ -0,0 +1,137 @@ + + + 4.0.0 + + org.usi.sq + sq-2021-a4 + 1.0 + + UTF-8 + 1.7.0-M1 + 5.6.2 + 5.6.2 + 4.13 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M5 + + alphabetical + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 8 + 8 + + + + org.jacoco + jacoco-maven-plugin + 0.8.5 + + + + prepare-agent + + + + + report + test + + report + + + + + + org.pitest + pitest-maven + 1.5.2 + + + org.usi.sq* + + + org.usi.sq* + * + + + + + org.pitest + pitest-junit5-plugin + 0.12 + + + + + + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + junit + junit + ${junit.version} + test + + + org.junit.vintage + junit-vintage-engine + ${junit.vintage.version} + test + + + + + + org.jacoco + jacoco-maven-plugin + + + + + report + + + + + + org.apache.maven.plugins + maven-surefire-report-plugin + 3.0.0-M5 + + + + + + org.apache.maven.plugins + maven-jxr-plugin + 2.1 + + + + + + diff --git a/SQ-2021-A4/src/main/java/org/usi/sq/util/numbers/INumberChecker.java b/SQ-2021-A4/src/main/java/org/usi/sq/util/numbers/INumberChecker.java new file mode 100644 index 0000000..e9580d6 --- /dev/null +++ b/SQ-2021-A4/src/main/java/org/usi/sq/util/numbers/INumberChecker.java @@ -0,0 +1,35 @@ +package org.usi.sq.util.numbers; + +public interface INumberChecker { + /** + * + * The method takes a string as input and checks if it is a valid hexadecimal number. + * It returns a boolean value that is: + * - true, if the string is a valid hexadecimal number + * - false, if the string is not a valid hexadecimal number + * + * A valid hexadecimal number is given by a string that satisfies the following conditions: + * - the string can start with a sign (+/- are the only signs accepted as starting char) + * - the first character of a hexadecimal number is a '0' + * - the second character of a hexadecimal number is an 'x' or an 'X' + * - the following characters of a hexadecimal number are decimal digits (from 0 to 9) or + * a letter of the alphabet between 'a' and 'f' (both lowercase and uppercase letters are valid) + * + * Examples of valid hexadecimal strings: + * - +0x47f8eca1d + * - 0Xadc4790da + * - 0xAB78cd3Ab + * + * Examples of invalid hexadecimal strings: + * - +07934abc (the pattern '0x' is not respected) + * - +-0xa45cb (the string can contain only '+' or '-', but not both) + * - xabCd73aC (the pattern '0x' is not respected) + * - 0xABd19Vc ('V' is not a valid character) + * + * @param str the string that needs to be checked + * @return the boolean result of the checking, that is, true if {@code str} + * is a valid hexadecimal number and false otherwise + * + * */ + boolean isHexNumber(final String str); +} diff --git a/SQ-2021-A4/src/main/java/org/usi/sq/util/numbers/NumberChecker.java b/SQ-2021-A4/src/main/java/org/usi/sq/util/numbers/NumberChecker.java new file mode 100644 index 0000000..dfcf3ce --- /dev/null +++ b/SQ-2021-A4/src/main/java/org/usi/sq/util/numbers/NumberChecker.java @@ -0,0 +1,62 @@ +package org.usi.sq.util.numbers; + +public class NumberChecker implements INumberChecker { + + /** + * The NumberChecker constructor. Do not use this constructor directly in + * test cases. + */ + public NumberChecker() { + } + + /** + * {@inheritDoc} + * See documentation of interface method {@code INumberChecker.isHexNumber}. + * The implementation of this method is an adapted excerpt of the method + * org.apache.commons.lang3.math.NumberUtils.isCreatable in the Apache + * Commons Lang library. + * + * @param str the string that needs to be checked + * @return true if {@code str} is a valid hexadecimal number and false + * otherwise + */ + public boolean isHexNumber(final String str) { + if (str == null || "".equals(str)){ + return false; + } + boolean isHex = true; + final char[] chars = str.toCharArray(); + int sz = chars.length; + int start = 0; + // leading sign + if(chars[0] == '-' || chars[0] == '+') + start = 1; + + if (sz > start + 1){ + if(chars[start] == '0') { + if (chars[start + 1] == 'x' || chars[start + 1] == 'X') { + int i = start + 2; + if (i == sz) { + isHex = false; // str == "0x" + } else { + // checking hex digits (it can't be anything else) + for (; i < chars.length; i++) { + if ((chars[i] < '0' || chars[i] > '9') + && (chars[i] < 'a' || chars[i] > 'f') + && (chars[i] < 'A' || chars[i] > 'F')) { + isHex = false; + } + } + } + } else { + isHex = false; + } + } else { + isHex = false; + } + } else { + isHex = false; + } + return isHex; + } +} diff --git a/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerBasicConditionCoverageTest.java b/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerBasicConditionCoverageTest.java new file mode 100644 index 0000000..1b463ea --- /dev/null +++ b/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerBasicConditionCoverageTest.java @@ -0,0 +1,18 @@ +package org.usi.sq.util.numbers; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; + +class NumberCheckerBasicConditionCoverageTest { + INumberChecker nc = null; + @BeforeEach + public void createNumberChecker(){ + nc = NumberCheckerFactory.create(); + } + @Test + public void test(){ + // create tests using nc + } +} diff --git a/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerBranchCoverageTest.java b/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerBranchCoverageTest.java new file mode 100644 index 0000000..0f3d37a --- /dev/null +++ b/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerBranchCoverageTest.java @@ -0,0 +1,70 @@ +package org.usi.sq.util.numbers; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class NumberCheckerBranchCoverageTest { + INumberChecker nc = null; + @BeforeEach + public void createNumberChecker(){ + nc = NumberCheckerFactory.create(); + } + + @Test + public void emptyStringNotHex() { + assertFalse(nc.isHexNumber("")); + } + + @Test + public void plusNotHex() { + assertFalse(nc.isHexNumber("+")); + } + + @Test + public void oneOneNotHex() { + assertFalse(nc.isHexNumber("11")); + } + + @Test + public void zeroBNotHex() { + assertFalse(nc.isHexNumber("0B")); + } + + @Test + public void zeroXNotHex() { + assertFalse(nc.isHexNumber("0x")); + } + + @Test + public void zeroXGNotHex() { + assertFalse(nc.isHexNumber("0xG")); + } + + @Test + public void zeroXZeroHex() { + assertTrue(nc.isHexNumber("0x0")); + } + + // NOTE: JaCoCo does not really measure branch coverage, but modified condition coverage (MCC). The following tests + // are needed to satisfy MCC, remove them for a minimal 100% branch coverage test suite + + @Test + public void nullIsNotHex() { + assertFalse(nc.isHexNumber(null)); + } + + @Test + public void offByOneNotHex() { + assertFalse(nc.isHexNumber("-0X!")); + assertFalse(nc.isHexNumber("-0Xg")); + } + + @Test + public void zeroXBIsHex() { + assertTrue(nc.isHexNumber("0xB")); + assertTrue(nc.isHexNumber("0xb")); + } +} diff --git a/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerFactory.java b/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerFactory.java new file mode 100644 index 0000000..ca3964d --- /dev/null +++ b/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerFactory.java @@ -0,0 +1,7 @@ +package org.usi.sq.util.numbers; + +public class NumberCheckerFactory { + public static INumberChecker create(){ + return new NumberChecker(); + } +} diff --git a/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerMCDCCoverageTest.java b/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerMCDCCoverageTest.java new file mode 100644 index 0000000..2241c74 --- /dev/null +++ b/SQ-2021-A4/src/test/java/org/usi/sq/util/numbers/NumberCheckerMCDCCoverageTest.java @@ -0,0 +1,19 @@ +package org.usi.sq.util.numbers; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class NumberCheckerMCDCCoverageTest { + INumberChecker nc = null; + @BeforeEach + public void createNumberChecker(){ + nc = NumberCheckerFactory.create(); + } + @Test + public void test(){ + // create tests using nc + } +}