diff --git a/.gitignore b/.gitignore
index 260dbbf..4f65755 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,5 @@ out
.idea
.gradle
*.iml
-*.class
\ No newline at end of file
+*.class
+.idea
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
deleted file mode 100644
index 5d1912a..0000000
--- a/.idea/workspace.xml
+++ /dev/null
@@ -1,1142 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
- DEFINITION_ORDER
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1517643780387
-
-
-
- 1517643780387
-
-
- 1517643892478
-
-
-
- 1517643892478
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index feb4c66..c9c495a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,9 +2,19 @@ group 'com.example'
version '0.0.1-SNAPSHOT'
apply plugin: 'java'
+apply plugin: "net.ltgt.apt"
+buildscript {
+ repositories {
+ maven {
+ url "https://plugins.gradle.org/m2/"
+ }
+ }
+ dependencies {
+ classpath "net.ltgt.gradle:gradle-apt-plugin:0.13"
+ }
+}
-sourceCompatibility = 1.8
-
+sourceCompatibility = 1.9
repositories {
mavenCentral()
@@ -13,7 +23,7 @@ repositories {
}
ext {
- lombokVersion = '1.16.18'
+ lombokVersion = '1.16.20'
jacksonVersion = '2.9.2'
socketioVersion = '1.0.0'
reactorVersion = '3.2.0.BUILD-SNAPSHOT'
@@ -24,7 +34,7 @@ ext {
}
dependencies {
- compile group: 'io.reactivex', name:'rxjava', version: rxJava1Version
+ compile group: 'io.reactivex', name: 'rxjava', version: rxJava1Version
compile group: 'io.socket', name: 'socket.io-client', version: socketioVersion
compile group: 'io.projectreactor.ipc', name: 'reactor-netty', version: reactorNettyVersion
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: jacksonVersion
@@ -32,7 +42,11 @@ dependencies {
compile group: 'junit', name: 'junit', version: '4.12'
compile group: 'io.projectreactor', name: 'reactor-test', version: reactorVersion
- testCompile group: 'org.powermock', name:'powermock-module-junit4', version: powerMockVersion
+ compileOnly group: 'org.projectlombok', name: 'lombok', version: lombokVersion
+
+ apt group: 'org.projectlombok', name: 'lombok', version: lombokVersion
+
+ testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: powerMockVersion
testCompile group: 'org.powermock', name: 'powermock-api-mockito2', version: powerMockVersion
}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 4d1893f..a5fe1cb 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index f5df6d6..288472a 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Sun Dec 03 12:42:02 EET 2017
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.5-bin.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-all.zip
+zipStoreBase=GRADLE_USER_HOME
diff --git a/src/main/java/com/example/common/StringEmitter.java b/src/main/java/com/example/common/StringEmitter.java
index a900af8..44ca941 100644
--- a/src/main/java/com/example/common/StringEmitter.java
+++ b/src/main/java/com/example/common/StringEmitter.java
@@ -3,6 +3,5 @@
import java.util.function.Consumer;
public interface StringEmitter {
-
void onString(Consumer consumer);
}
diff --git a/src/main/java/com/example/cryptotrading/StatisticMessage.java b/src/main/java/com/example/cryptotrading/StatisticMessage.java
index 4b4c4a1..3798481 100644
--- a/src/main/java/com/example/cryptotrading/StatisticMessage.java
+++ b/src/main/java/com/example/cryptotrading/StatisticMessage.java
@@ -1,12 +1,19 @@
package com.example.cryptotrading;
+import lombok.Data;
+import lombok.experimental.FieldDefaults;
+
import java.time.Instant;
+import static lombok.AccessLevel.PRIVATE;
+
+@Data
+@FieldDefaults(level = PRIVATE, makeFinal = true)
public class StatisticMessage {
- private final long timestamp;
- private final float data;
- private final String currency;
- private final StatisticMessage.Type type;
+ long timestamp;
+ float data;
+ String currency;
+ StatisticMessage.Type type;
public StatisticMessage(float data, String currency, Type type) {
this.timestamp = Instant.now().toEpochMilli();
@@ -15,56 +22,6 @@ public StatisticMessage(float data, String currency, Type type) {
this.type = type;
}
- public float getData() {
- return this.data;
- }
-
- public String getCurrency() {
- return this.currency;
- }
-
- public Type getType() {
- return this.type;
- }
-
- public long getTimestamp() {
- return timestamp;
- }
-
- public boolean equals(Object o) {
- if (o == this) return true;
- if (!(o instanceof StatisticMessage)) return false;
- final StatisticMessage other = (StatisticMessage) o;
- if (Float.compare(this.getData(), other.getData()) != 0) return false;
- final Object this$currency = this.getCurrency();
- final Object other$currency = other.getCurrency();
- if (this$currency == null ? other$currency != null : !this$currency.equals(other$currency)) return false;
- final Object this$type = this.getType();
- final Object other$type = other.getType();
- if (this$type == null ? other$type != null : !this$type.equals(other$type)) return false;
- final Object this$timestamp = this.getTimestamp();
- final Object other$timestamp = other.getTimestamp();
- if (!this$timestamp.equals(other$timestamp)) return false;
- return true;
- }
-
- public int hashCode() {
- final int PRIME = 59;
- int result = 1;
- result = result * PRIME + Float.floatToIntBits(this.getData());
- final Object $currency = this.getCurrency();
- result = result * PRIME + ($currency == null ? 43 : $currency.hashCode());
- final Object $type = this.getType();
- result = result * PRIME + ($type == null ? 43 : $type.hashCode());
- final Object $timestamp = this.getTimestamp();
- result = result * PRIME + ($timestamp.hashCode());
- return result;
- }
-
- public String toString() {
- return "StatisticMessage(data=" + this.getData() + ", currency=" + this.getCurrency() + ", type=" + this.getType() + ", timestamp=" + this.getTimestamp() + ")";
- }
-
public enum Type {
PRICE, AVG
}
diff --git a/src/main/java/com/example/cryptotrading/utils/StatisticUtils.java b/src/main/java/com/example/cryptotrading/utils/StatisticUtils.java
index cb04481..4b3bbbb 100644
--- a/src/main/java/com/example/cryptotrading/utils/StatisticUtils.java
+++ b/src/main/java/com/example/cryptotrading/utils/StatisticUtils.java
@@ -1,16 +1,19 @@
package com.example.cryptotrading.utils;
import com.example.cryptotrading.StatisticMessage;
+import lombok.experimental.FieldDefaults;
import reactor.core.publisher.Flux;
import java.util.Map;
+import static lombok.AccessLevel.PRIVATE;
+
+@FieldDefaults(level = PRIVATE, makeFinal = true)
public class StatisticUtils {
- private static final String PRICE_KEY = "PRICE";
- private static final String CURRENCY_KEY = "FROMSYMBOL";
+ static String PRICE_KEY = "PRICE";
+ static String CURRENCY_KEY = "FROMSYMBOL";
- public static Flux transform(Flux> input,
- Flux averagesTimeInterval) {
+ public static Flux transform(Flux> input, Flux averagesTimeInterval) {
throw new RuntimeException("Not implemented yet");
@@ -21,24 +24,24 @@ public static Flux transform(Flux> input,
// return Flux.merge(
- // --------------------------------------------------------------------------------------------------
-
- // 1.1) TODO Collect crypto currency price during the interval of seconds
- // HINT consider corner case when client did not send any info about interval (add initial interval (mergeWith(...)))
- // HINT use window + switchMap
- // 1.2) TODO group collected Maps result by currency
- // HINT to get currency name from the Map use CURRENCY_KEY constant
- // HINT for reduce consider to reuse Sum.empty and Sum#add
- // 1.3.1) TODO Filter grouped stream on map without price info
- // 1.3.2) TODO Grouped filtered stream reduce calculate average
- // 1.3.3) TODO map to Statistic message using StatisticMessage#avg()
- //input...,
-
- //
- // 2.1) TODO hold latest event with currency price to send latest price if new incoming event does not include price info
- // HINT use .scan() + HashMap + .filter to ensure that after proper scan passed map include Price
- // 2.2) TODO map to Statistic message using StatisticMessage#price()
- //input...
+ // --------------------------------------------------------------------------------------------------
+
+ // 1.1) TODO Collect crypto currency price during the interval of seconds
+ // HINT consider corner case when client did not send any info about interval (add initial interval (mergeWith(...)))
+ // HINT use window + switchMap
+ // 1.2) TODO group collected Maps result by currency
+ // HINT to get currency name from the Map use CURRENCY_KEY constant
+ // HINT for reduce consider to reuse Sum.empty and Sum#add
+ // 1.3.1) TODO Filter grouped stream on map without price info
+ // 1.3.2) TODO Grouped filtered stream reduce calculate average
+ // 1.3.3) TODO map to Statistic message using StatisticMessage#avg()
+ //input...,
+
+ //
+ // 2.1) TODO hold latest event with currency price to send latest price if new incoming event does not include price info
+ // HINT use .scan() + HashMap + .filter to ensure that after proper scan passed map include Price
+ // 2.2) TODO map to Statistic message using StatisticMessage#price()
+ //input...
// );
}
diff --git a/src/main/java/com/example/cryptotrading/utils/Sum.java b/src/main/java/com/example/cryptotrading/utils/Sum.java
index 2de5316..06d2b90 100644
--- a/src/main/java/com/example/cryptotrading/utils/Sum.java
+++ b/src/main/java/com/example/cryptotrading/utils/Sum.java
@@ -1,52 +1,13 @@
package com.example.cryptotrading.utils;
-public class Sum {
- private final float value;
- private final int counter;
-
- public Sum(float value, int counter) {
- this.value = value;
- this.counter = counter;
- }
-
- public Sum add(float value) {
- return new Sum(this.value + value, this.counter + 1);
- }
-
- public float avg() {
- return value / counter;
- }
-
- public static Sum empty() {
- return new Sum(0, 0);
- }
+import lombok.Data;
+import lombok.experimental.FieldDefaults;
- public float getValue() {
- return this.value;
- }
+import static lombok.AccessLevel.PRIVATE;
- public int getCounter() {
- return this.counter;
- }
-
- public boolean equals(Object o) {
- if (o == this) return true;
- if (!(o instanceof Sum)) return false;
- final Sum other = (Sum) o;
- if (Float.compare(this.getValue(), other.getValue()) != 0) return false;
- if (this.getCounter() != other.getCounter()) return false;
- return true;
- }
-
- public int hashCode() {
- final int PRIME = 59;
- int result = 1;
- result = result * PRIME + Float.floatToIntBits(this.getValue());
- result = result * PRIME + this.getCounter();
- return result;
- }
-
- public String toString() {
- return "Sum(value=" + this.getValue() + ", counter=" + this.getCounter() + ")";
- }
+@Data
+@FieldDefaults(level = PRIVATE, makeFinal = true)
+public class Sum {
+ float value;
+ int counter;
}
diff --git a/src/main/java/com/example/essential/IndexedWord.java b/src/main/java/com/example/essential/IndexedWord.java
index f040196..3fd5cb0 100644
--- a/src/main/java/com/example/essential/IndexedWord.java
+++ b/src/main/java/com/example/essential/IndexedWord.java
@@ -1,45 +1,15 @@
package com.example.essential;
-import java.util.Objects;
+import lombok.Data;
+import lombok.NonNull;
+import lombok.experimental.FieldDefaults;
-public class IndexedWord {
- private final int index;
- private final String word;
-
- public IndexedWord(int index, String word) {
- this.index = index;
- this.word = Objects.requireNonNull(word);
- }
-
- public int getIndex() {
- return this.index;
- }
-
- public String getWord() {
- return this.word;
- }
+import static lombok.AccessLevel.PRIVATE;
- public boolean equals(Object o) {
- if (o == this) return true;
- if (!(o instanceof IndexedWord)) return false;
- final IndexedWord other = (IndexedWord) o;
- if (this.getIndex() != other.getIndex()) return false;
- final Object this$word = this.getWord();
- final Object other$word = other.getWord();
- if (this$word == null ? other$word != null : !this$word.equals(other$word)) return false;
- return true;
- }
-
- public int hashCode() {
- final int PRIME = 59;
- int result = 1;
- result = result * PRIME + this.getIndex();
- final Object $word = this.getWord();
- result = result * PRIME + ($word == null ? 43 : $word.hashCode());
- return result;
- }
-
- public String toString() {
- return "IndexedWord(index=" + this.getIndex() + ", word=" + this.getWord() + ")";
- }
+@Data
+@FieldDefaults(level = PRIVATE, makeFinal = true)
+public class IndexedWord {
+ int index;
+ @NonNull
+ String word;
}
diff --git a/src/main/java/com/example/store/Order.java b/src/main/java/com/example/store/Order.java
index ae68582..a431cd4 100644
--- a/src/main/java/com/example/store/Order.java
+++ b/src/main/java/com/example/store/Order.java
@@ -1,19 +1,21 @@
package com.example.store;
+import lombok.Data;
+import lombok.NonNull;
+import lombok.experimental.FieldDefaults;
import rx.Observable;
-import java.util.Objects;
+import static lombok.AccessLevel.PRIVATE;
+@Data
+@FieldDefaults(level = PRIVATE, makeFinal = true)
public class Order {
- private final String id;
- private final String userId;
- private final Iterable productsIds;
-
- public Order(String id, String userId, Iterable productsIds) {
- this.id = Objects.requireNonNull(id);
- this.userId = Objects.requireNonNull(userId);
- this.productsIds = Objects.requireNonNull(productsIds);
- }
+ @NonNull
+ String id;
+ @NonNull
+ String userId;
+ @NonNull
+ Iterable productsIds;
public Observable getTotalPrice() {
// TODO: use reduce to find the sum;
@@ -22,49 +24,4 @@ public Observable getTotalPrice() {
// HINT: Observable.from + Observable#map + Observable#reduce
throw new RuntimeException("Not implemented yet");
}
-
- public String getId() {
- return this.id;
- }
-
- public String getUserId() {
- return this.userId;
- }
-
- public Iterable getProductsIds() {
- return this.productsIds;
- }
-
- public boolean equals(Object o) {
- if (o == this) return true;
- if (!(o instanceof Order)) return false;
- final Order other = (Order) o;
- final Object this$id = this.getId();
- final Object other$id = other.getId();
- if (this$id == null ? other$id != null : !this$id.equals(other$id)) return false;
- final Object this$userId = this.getUserId();
- final Object other$userId = other.getUserId();
- if (this$userId == null ? other$userId != null : !this$userId.equals(other$userId)) return false;
- final Object this$productsIds = this.getProductsIds();
- final Object other$productsIds = other.getProductsIds();
- if (this$productsIds == null ? other$productsIds != null : !this$productsIds.equals(other$productsIds))
- return false;
- return true;
- }
-
- public int hashCode() {
- final int PRIME = 59;
- int result = 1;
- final Object $id = this.getId();
- result = result * PRIME + ($id == null ? 43 : $id.hashCode());
- final Object $userId = this.getUserId();
- result = result * PRIME + ($userId == null ? 43 : $userId.hashCode());
- final Object $productsIds = this.getProductsIds();
- result = result * PRIME + ($productsIds == null ? 43 : $productsIds.hashCode());
- return result;
- }
-
- public String toString() {
- return "Order(id=" + this.getId() + ", userId=" + this.getUserId() + ", productsIds=" + this.getProductsIds() + ")";
- }
}
diff --git a/src/main/java/com/example/store/Product.java b/src/main/java/com/example/store/Product.java
index cad44df..7eb60f6 100644
--- a/src/main/java/com/example/store/Product.java
+++ b/src/main/java/com/example/store/Product.java
@@ -1,57 +1,17 @@
package com.example.store;
-import java.util.Objects;
+import lombok.Data;
+import lombok.NonNull;
+import lombok.experimental.FieldDefaults;
-public class Product {
- private final String id;
- private final String name;
- private final long price;
-
- public Product(String id, String name, long price) {
- this.id = Objects.requireNonNull(id);
- this.name = Objects.requireNonNull(name);
- this.price = Objects.requireNonNull(price);
- }
-
- public String getId() {
- return this.id;
- }
-
- public String getName() {
- return this.name;
- }
+import static lombok.AccessLevel.PRIVATE;
- public long getPrice() {
- return this.price;
- }
-
- public boolean equals(Object o) {
- if (o == this) return true;
- if (!(o instanceof Product)) return false;
- final Product other = (Product) o;
- final Object this$id = this.getId();
- final Object other$id = other.getId();
- if (this$id == null ? other$id != null : !this$id.equals(other$id)) return false;
- final Object this$name = this.getName();
- final Object other$name = other.getName();
- if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;
- if (this.getPrice() != other.getPrice()) return false;
- return true;
- }
-
- public int hashCode() {
- final int PRIME = 59;
- int result = 1;
- final Object $id = this.getId();
- result = result * PRIME + ($id == null ? 43 : $id.hashCode());
- final Object $name = this.getName();
- result = result * PRIME + ($name == null ? 43 : $name.hashCode());
- final long $price = this.getPrice();
- result = result * PRIME + (int) ($price >>> 32 ^ $price);
- return result;
- }
-
- public String toString() {
- return "Product(id=" + this.getId() + ", name=" + this.getName() + ", price=" + this.getPrice() + ")";
- }
+@Data
+@FieldDefaults(level = PRIVATE, makeFinal = true)
+public class Product {
+ @NonNull
+ String id;
+ @NonNull
+ String name;
+ long price;
}
diff --git a/src/main/java/com/example/store/ProductsCatalog.java b/src/main/java/com/example/store/ProductsCatalog.java
index 9ab06c9..8c23069 100644
--- a/src/main/java/com/example/store/ProductsCatalog.java
+++ b/src/main/java/com/example/store/ProductsCatalog.java
@@ -1,12 +1,18 @@
package com.example.store;
+import lombok.experimental.FieldDefaults;
+
+import java.security.SecureRandom;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
+import static lombok.AccessLevel.PRIVATE;
+
+@FieldDefaults(level = PRIVATE, makeFinal = true)
public class ProductsCatalog {
- private static Random random = new Random();
- private static List PRODUCTS_NAMES = Arrays.asList(
+ static Random random = new SecureRandom();
+ static List PRODUCTS_NAMES = Arrays.asList(
"Phone",
"TV",
"SonyPlayStation",
diff --git a/src/main/java/com/example/store/UserActivityUtils.java b/src/main/java/com/example/store/UserActivityUtils.java
index fc48135..69e3d0b 100644
--- a/src/main/java/com/example/store/UserActivityUtils.java
+++ b/src/main/java/com/example/store/UserActivityUtils.java
@@ -4,7 +4,6 @@
import rx.Observable;
public class UserActivityUtils {
-
public static Observable findMostExpansivePurchase(Observable ordersHistory) {
// TODO: flatten all Products inside Orders and using reduce find one with the highest price
throw new RuntimeException("Not implemented yet");
diff --git a/src/test/java/com/example/common/TestStringEmitter.java b/src/test/java/com/example/common/TestStringEmitter.java
index b6795cb..d6fd922 100644
--- a/src/test/java/com/example/common/TestStringEmitter.java
+++ b/src/test/java/com/example/common/TestStringEmitter.java
@@ -3,8 +3,7 @@
import java.util.function.Consumer;
public class TestStringEmitter implements StringEmitter {
-
- public Consumer consumer;
+ public Consumer consumer;
@Override
public void onString(Consumer consumer) {
diff --git a/src/test/java/com/example/cryptotrading/utils/StatisticUtilsTest.java b/src/test/java/com/example/cryptotrading/utils/StatisticUtilsTest.java
index f3e9052..a6c2009 100644
--- a/src/test/java/com/example/cryptotrading/utils/StatisticUtilsTest.java
+++ b/src/test/java/com/example/cryptotrading/utils/StatisticUtilsTest.java
@@ -3,7 +3,6 @@
import org.junit.Test;
public class StatisticUtilsTest {
-
//FIXME consider to verify all corner cases
@Test