Skip to content

Commit

Permalink
fix: bug #1; feat: unit test optimize
Browse files Browse the repository at this point in the history
  • Loading branch information
EeeMt committed May 9, 2020
1 parent 3a74392 commit 7b967d6
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 37 deletions.
7 changes: 6 additions & 1 deletion CHANGLOG
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,9 @@

## 1.0.5-202004

- 更新数据版本到2020.04
- 更新数据版本到2020.04

## 1.0.6-202004

- 修复一个bug https://github.com/EeeMt/phone-number-geo/issues/1
- 优化单元测试
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>me.ihxq.projects</groupId>
<artifactId>phone-number-geo</artifactId>
<version>1.0.5-202004</version>
<version>1.0.6-202004</version>
<packaging>jar</packaging>
<name>phone-number-geo</name>
<url>https://github.com/EeeMt/phone-number-geo</url>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,6 @@ private int compare(int position, int key, ByteBuffer byteBuffer) {
try {
phonePrefix = byteBuffer.getInt();
} catch (Exception e) {
System.out.println("position: " + position);
throw new RuntimeException(e);
}
return Integer.compare(phonePrefix, key);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ public Optional<PhoneNumberInfo> lookup(String phoneNumber) {
int left = indicesStartOffset;
int right = indicesEndOffset;
int mid = (left + right) / 2;
mid = strictMid(mid);
while (mid >= left && mid <= right) {
if (mid == right) {
return Optional.empty();
Expand Down
83 changes: 83 additions & 0 deletions src/test/java/me/ihxq/projects/pna/AlgorithmResultDifferTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package me.ihxq.projects.pna;

import lombok.extern.slf4j.Slf4j;
import me.ihxq.projects.pna.algorithm.LookupAlgorithm;
import org.junit.jupiter.api.Test;
import org.junit.platform.commons.util.ReflectionUtils;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.assertTrue;

/**
* @author xq.h
* on 2019/10/18 22:30
**/
@Slf4j
public class AlgorithmResultDifferTest {

private boolean isDiff(List<Optional<PhoneNumberInfo>> candidates) {
boolean allPresent = false;
boolean allAbsent = false;
PhoneNumberInfo temp = null;
for (Optional<PhoneNumberInfo> candidate : candidates) {
if (candidate.isPresent()) {
allPresent = true;
if (allAbsent) {
return false;
}
if (temp == null) {
temp = candidate.get();
} else {
if (!temp.equals(candidate.get())) {
return false;
} else {
temp = candidate.get();
}
}
} else {
allAbsent = true;
if (allPresent) {
return false;
}
}
}
return false;
}

/**
* test all {@link LookupAlgorithm} implements result whether the same or not
*/
@Test
public void testDiff() {
List<PhoneNumberLookup> lookups = ReflectionUtils.findAllClassesInPackage("me.ihxq.projects.pna", v -> Arrays.asList(v.getInterfaces()).contains(LookupAlgorithm.class), v -> true)
.stream()
.map(c -> {
try {
LookupAlgorithm algorithm = (LookupAlgorithm) c.newInstance();
return new PhoneNumberLookup(algorithm);
} catch (Exception e) {
throw new RuntimeException(e);
}
})
.collect(Collectors.toList());
boolean noneMatch = Stream.generate(() -> {
long phoneNumber = (long) (ThreadLocalRandom.current().nextDouble(1D, 2D) * 1000_000_000_0L);
return String.valueOf(phoneNumber);
}).limit(2_000)
.parallel()
.noneMatch(v -> {
List<Optional<PhoneNumberInfo>> results = lookups.stream()
.map(l -> l.lookup(v))
.collect(Collectors.toList());
return isDiff(results);
});
assertTrue(noneMatch);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,31 @@
@Slf4j
public class PhoneNumberLookupAlgorithmTest {

private PhoneNumberLookup constructLookup(LookupAlgorithm algorithm) {
PhoneNumberLookup phoneNumberLookup;
if (algorithm == null) {
phoneNumberLookup = new PhoneNumberLookup();
} else {
phoneNumberLookup = new PhoneNumberLookup(algorithm);
}
return phoneNumberLookup;
}

@ParameterizedTest
@MethodSource("algorithms")
public void invalid(LookupAlgorithm algorithm) {
PhoneNumberLookup phoneNumberLookup = new PhoneNumberLookup(algorithm);
assertNull(phoneNumberLookup.lookup(null).orElse(null));
assertNull(phoneNumberLookup.lookup("000").orElse(null));
assertNull(phoneNumberLookup.lookup("-1").orElse(null));
assertNull(phoneNumberLookup.lookup("130898976761").orElse(null));
PhoneNumberLookup phoneNumberLookup = constructLookup(algorithm);
assertFalse(phoneNumberLookup.lookup(null).isPresent());
assertFalse(phoneNumberLookup.lookup("000").isPresent());
assertFalse(phoneNumberLookup.lookup("136800O0000").isPresent()); // it's 'O', a letter, which should be '0'
assertFalse(phoneNumberLookup.lookup("-1").isPresent());
assertFalse(phoneNumberLookup.lookup("130898976761").isPresent());
}

@ParameterizedTest
@MethodSource("algorithms")
public void lookup(LookupAlgorithm algorithm) {
PhoneNumberLookup phoneNumberLookup = new PhoneNumberLookup(algorithm);
PhoneNumberLookup phoneNumberLookup = constructLookup(algorithm);
PhoneNumberInfo found = phoneNumberLookup.lookup("18798896741").orElseThrow(RuntimeException::new);
assertNotNull(found.getAttribution());
assertEquals(found.getNumber(), "18798896741");
Expand All @@ -45,7 +56,7 @@ public void lookup(LookupAlgorithm algorithm) {
@ParameterizedTest
@MethodSource("algorithms")
public void lookupVirtual(LookupAlgorithm algorithm) {
PhoneNumberLookup phoneNumberLookup = new PhoneNumberLookup(algorithm);
PhoneNumberLookup phoneNumberLookup = constructLookup(algorithm);
PhoneNumberInfo found = phoneNumberLookup.lookup("17048978123").orElseThrow(RuntimeException::new);
assertNotNull(found.getAttribution());
assertEquals(found.getNumber(), "17048978123");
Expand All @@ -59,7 +70,7 @@ public void lookupVirtual(LookupAlgorithm algorithm) {
@ParameterizedTest
@MethodSource("algorithms")
public void concurrencyLookup(LookupAlgorithm algorithm) {
PhoneNumberLookup phoneNumberLookup = new PhoneNumberLookup(algorithm);
PhoneNumberLookup phoneNumberLookup = constructLookup(algorithm);
//noinspection ResultOfMethodCallIgnored
Stream.generate(() -> {
long phoneNumber = (long) (ThreadLocalRandom.current().nextDouble(1D, 2D) * 1000_000_000_0L);
Expand All @@ -72,26 +83,27 @@ public void concurrencyLookup(LookupAlgorithm algorithm) {
@ParameterizedTest
@MethodSource("algorithms")
public void lookupFirst(LookupAlgorithm algorithm) {
PhoneNumberLookup phoneNumberLookup = new PhoneNumberLookup(algorithm);
PhoneNumberLookup phoneNumberLookup = constructLookup(algorithm);
assertNotNull(phoneNumberLookup.lookup("13000000000"));
}

@ParameterizedTest
@MethodSource("algorithms")
public void lookupLast(LookupAlgorithm algorithm) {
PhoneNumberLookup phoneNumberLookup = new PhoneNumberLookup(algorithm);
PhoneNumberLookup phoneNumberLookup = constructLookup(algorithm);
assertNotNull(phoneNumberLookup.lookup("19999790000"));
}

@ParameterizedTest
@MethodSource("algorithms")
public void lookupEqual(LookupAlgorithm algorithm) {
PhoneNumberLookup phoneNumberLookup = new PhoneNumberLookup(algorithm);
PhoneNumberLookup phoneNumberLookup = constructLookup(algorithm);
assertEquals(phoneNumberLookup.lookup("19999790000"), phoneNumberLookup.lookup("19999790000"));
}

public static Stream<LookupAlgorithm> algorithms() {
return Stream.of(
null,
new BinarySearchAlgorithmImpl(),
new ProspectBinarySearchAlgorithmImpl(),
new SequenceLookupAlgorithmImpl(),
Expand Down
23 changes: 0 additions & 23 deletions src/test/java/me/ihxq/projects/pna/PhoneNumberLookupTest.java

This file was deleted.

0 comments on commit 7b967d6

Please sign in to comment.