Update unit tests and add performance analyze

This commit is contained in:
Rui Hu 2024-03-14 11:30:15 +08:00
parent 72ae4c0136
commit 6782050414
4 changed files with 88 additions and 20 deletions

View File

@ -28,4 +28,12 @@ java {
tasks.test {
useJUnitPlatform()
jvmArgs = listOf("-Dfast=true")
}
tasks.register("runPerformanceAnalyze", JavaExec::class.java)
tasks.named<JavaExec>("runPerformanceAnalyze") {
dependsOn("testClasses")
group = "verification"
classpath = sourceSets.test.get().runtimeClasspath
mainClass.set("com.cleverthis.interview.PerformanceAnalyze")
}

View File

@ -0,0 +1,47 @@
package com.cleverthis.interview;
import com.cleverthis.interview.padlock.PadlockImpl;
/**
* Performance test but not mean to run in unit test.
*/
public class PerformanceAnalyze {
private static void solve(PadlockImpl padlock) {
// TODO
}
private static final String RUN_NAME = "Boilerplate";
private static final int TOTAL_RUN = 50;
private static final int NUMPAD_SIZE = 7;
static {
System.out.println("Run name: " + RUN_NAME);
System.out.println("Total run: " + TOTAL_RUN);
System.out.println("Numpad size: " + NUMPAD_SIZE);
}
public static void main(String[] args) {
long timeSum = 0;
long writeSum = 0;
for (int i = 0; i < TOTAL_RUN; i++) {
PadlockImpl padlock = new PadlockImpl(NUMPAD_SIZE);
padlock.resetCounter();
long start = System.currentTimeMillis();
solve(padlock);
long end = System.currentTimeMillis();
if (!padlock.isPasscodeCorrect()) throw new IllegalStateException(
"Invalid solution: passcode not correct after return");
long dT = end - start;
timeSum += dT;
writeSum += padlock.getWriteCounter();
System.out.println("Run #" + (i + 1) + ": time: " + dT + "ms; write: " + padlock.getWriteCounter());
}
System.out.println("Run time sum: " + timeSum + "ms");
System.out.println("Write sum: " + writeSum);
double avgTime = timeSum / (double) TOTAL_RUN;
double avgWrite = writeSum / (double) TOTAL_RUN;
System.out.println("Avg run time: " + avgTime + "ms");
System.out.println("Avg write: " + avgWrite);
System.out.println("Calculated estimate avg run time: " + (avgTime / 1000 + avgTime) + "s");
}
}

View File

@ -1,30 +1,13 @@
package com.cleverthis.interview;
import com.cleverthis.interview.padlock.PadlockImpl;
import org.junit.jupiter.api.Test;
import java.util.Random;
import static org.junit.jupiter.api.Assertions.*;
/**
* This is a simple placeholder to show how unit test works.
* You can replace it with your own test.
*/
class SolutionTest {
private void solve(PadlockImpl padlock) {
class SolutionTest extends SolutionTestBase {
@Override
protected void solve(PadlockImpl padlock) {
new Solution().solve(padlock);
}
@Test
void verify(){
Random random = new Random();
PadlockImpl padlock = new PadlockImpl(random.nextInt(1, 8));
long startTime = System.currentTimeMillis();
solve(padlock);
long endTime = System.currentTimeMillis();
assertTrue(padlock.isPasscodeCorrect());
System.out.println("Time usage: " + (endTime - startTime) + "ms");
}
}

View File

@ -0,0 +1,30 @@
package com.cleverthis.interview;
import com.cleverthis.interview.padlock.PadlockImpl;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* This is a base class for verifying the correctness of the solution.
*/
public abstract class SolutionTestBase {
/**
* Implement your solution in this function.
* */
protected abstract void solve(PadlockImpl padlock);
protected void verify(int numpadSize) {
PadlockImpl padlock = new PadlockImpl(numpadSize);
solve(padlock);
assertTrue(padlock.isPasscodeCorrect());
}
@Test
void verify1to7() {
for (int i = 1; i <= 7; i++) {
verify(i);
}
}
}