graded assignment 2a done (with assumption on JaCoCo)
This commit is contained in:
parent
01c833b44f
commit
75448022dd
7 changed files with 348 additions and 0 deletions
137
SQ-2021-A4/pom.xml
Normal file
137
SQ-2021-A4/pom.xml
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>org.usi.sq</groupId>
|
||||||
|
<artifactId>sq-2021-a4</artifactId>
|
||||||
|
<version>1.0</version>
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<junit.platform.version>1.7.0-M1</junit.platform.version>
|
||||||
|
<junit.jupiter.version>5.6.2</junit.jupiter.version>
|
||||||
|
<junit.vintage.version>5.6.2</junit.vintage.version>
|
||||||
|
<junit.version>4.13</junit.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>3.0.0-M5</version>
|
||||||
|
<configuration>
|
||||||
|
<runOrder>alphabetical</runOrder>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<configuration>
|
||||||
|
<source>8</source>
|
||||||
|
<target>8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.jacoco</groupId>
|
||||||
|
<artifactId>jacoco-maven-plugin</artifactId>
|
||||||
|
<version>0.8.5</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>prepare-agent</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
<!-- attached to Maven test phase -->
|
||||||
|
<execution>
|
||||||
|
<id>report</id>
|
||||||
|
<phase>test</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>report</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.pitest</groupId>
|
||||||
|
<artifactId>pitest-maven</artifactId>
|
||||||
|
<version>1.5.2</version>
|
||||||
|
<configuration>
|
||||||
|
<targetClasses>
|
||||||
|
<param>org.usi.sq*</param>
|
||||||
|
</targetClasses>
|
||||||
|
<targetTests>
|
||||||
|
<param>org.usi.sq*</param>
|
||||||
|
<param>*</param>
|
||||||
|
</targetTests>
|
||||||
|
</configuration>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.pitest</groupId>
|
||||||
|
<artifactId>pitest-junit5-plugin</artifactId>
|
||||||
|
<version>0.12</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
|
<version>${junit.jupiter.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
<version>${junit.jupiter.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>${junit.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.vintage</groupId>
|
||||||
|
<artifactId>junit-vintage-engine</artifactId>
|
||||||
|
<version>${junit.vintage.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<reporting>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.jacoco</groupId>
|
||||||
|
<artifactId>jacoco-maven-plugin</artifactId>
|
||||||
|
<reportSets>
|
||||||
|
<reportSet>
|
||||||
|
<reports>
|
||||||
|
<!-- select non-aggregate reports -->
|
||||||
|
<report>report</report>
|
||||||
|
</reports>
|
||||||
|
</reportSet>
|
||||||
|
</reportSets>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-report-plugin</artifactId>
|
||||||
|
<version>3.0.0-M5</version>
|
||||||
|
<configuration>
|
||||||
|
<!-- place configuration here if required-->
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jxr-plugin</artifactId>
|
||||||
|
<version>2.1</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</reporting>
|
||||||
|
|
||||||
|
|
||||||
|
</project>
|
|
@ -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);
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
|
@ -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"));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package org.usi.sq.util.numbers;
|
||||||
|
|
||||||
|
public class NumberCheckerFactory {
|
||||||
|
public static INumberChecker create(){
|
||||||
|
return new NumberChecker();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
Reference in a new issue