You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by kh...@apache.org on 2019/06/02 21:22:47 UTC

[commons-statistics] branch STATISTICS-14 updated (a16e516 -> 3b06cfd)

This is an automated email from the ASF dual-hosted git repository.

khmarbaise pushed a change to branch STATISTICS-14
in repository https://gitbox.apache.org/repos/asf/commons-statistics.git.


 discard a16e516  WIP - STATISTICS-14 - Improved code.
 discard e0a3472  WIP - STATISTICS-14 - Improved code.
 discard 9822824  WIP - STATISTICS-14 - Improved.
 discard cf8a4bc  WIP - STATISTICS-14 - Improved.
 discard 2077ae4  Added package-info etc.
 discard 813f5b0  [STATISTICS-14] - BigDecimalStatistics
     new 3b06cfd  [STATISTICS-14] - BigDecimalStatistics

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (a16e516)
            \
             N -- N -- N   refs/heads/STATISTICS-14 (3b06cfd)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:


[commons-statistics] 01/01: [STATISTICS-14] - BigDecimalStatistics

Posted by kh...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

khmarbaise pushed a commit to branch STATISTICS-14
in repository https://gitbox.apache.org/repos/asf/commons-statistics.git

commit 3b06cfdc3d6d6f073e8292ac77f6bee12e711052
Author: Karl Heinz Marbaise <kh...@apache.org>
AuthorDate: Sun Jun 2 23:22:33 2019 +0200

    [STATISTICS-14] - BigDecimalStatistics
---
 commons-statistics-bigdecimal/pom.xml              |  77 +++++++
 .../descriptive/BigDecimalSummaryStatistics.java   | 233 ++++++++++++++++++++
 .../bigdecimal/descriptive/package-info.java       |  20 ++
 .../src/site/resources/profile.jacoco              |  17 ++
 .../BigDecimalSummaryStatisticsAssert.java         |  54 +++++
 .../BigDecimalSummaryStatisticsTest.java           | 234 +++++++++++++++++++++
 pom.xml                                            |   1 +
 7 files changed, 636 insertions(+)

diff --git a/commons-statistics-bigdecimal/pom.xml b/commons-statistics-bigdecimal/pom.xml
new file mode 100644
index 0000000..3f5faa6
--- /dev/null
+++ b/commons-statistics-bigdecimal/pom.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.commons</groupId>
+    <artifactId>commons-statistics-parent</artifactId>
+    <version>0.1-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.apache.commons</groupId>
+  <artifactId>commons-statistics-bigdecimal</artifactId>
+  <version>0.1-SNAPSHOT</version>
+  <name>Apache Commons Statistics BigDecimal</name>
+
+  <description>BigDecimal.</description>
+
+  <properties>
+    <!-- This value must reflect the current name of the base package. -->
+    <commons.osgi.symbolicName>org.apache.commons.statistics.bigdecimal</commons.osgi.symbolicName>
+    <!-- OSGi -->
+    <commons.osgi.export>org.apache.commons.statistics.bigdecimal</commons.osgi.export>
+    <!-- Workaround to avoid duplicating config files. -->
+    <statistics.parent.dir>${basedir}/..</statistics.parent.dir>
+  </properties>
+
+  <dependencyManagement>
+    <!--
+     ! Should be move to parent if it's decided to go that path or not.
+     -->
+    <dependencies>
+      <dependency>
+        <groupId>org.junit</groupId>
+        <artifactId>junit-bom</artifactId>
+        <version>5.4.2</version>
+        <scope>import</scope>
+        <type>pom</type>
+      </dependency>
+      <dependency>
+        <groupId>org.assertj</groupId>
+        <artifactId>assertj-core</artifactId>
+        <version>3.12.2</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+  <dependencies>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-engine</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.assertj</groupId>
+      <artifactId>assertj-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/commons-statistics-bigdecimal/src/main/java/org/apache/commons/statistics/bigdecimal/descriptive/BigDecimalSummaryStatistics.java b/commons-statistics-bigdecimal/src/main/java/org/apache/commons/statistics/bigdecimal/descriptive/BigDecimalSummaryStatistics.java
new file mode 100644
index 0000000..a2625fc
--- /dev/null
+++ b/commons-statistics-bigdecimal/src/main/java/org/apache/commons/statistics/bigdecimal/descriptive/BigDecimalSummaryStatistics.java
@@ -0,0 +1,233 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.statistics.bigdecimal.descriptive;
+
+import java.math.BigDecimal;
+import java.util.function.Consumer;
+
+/**
+ * Implementation for BigDecimalSummaryStatistics based on {@link java.util.DoubleSummaryStatistics}.
+ */
+public class BigDecimalSummaryStatistics implements Consumer<BigDecimal> {
+
+    /**
+     * internal counter.
+     */
+    private long count;
+    /**
+     * The total.
+     */
+    private BigDecimal sum;
+    /**
+     * The minimum.
+     */
+    private BigDecimal min;
+    /**
+     * The maximum.
+     */
+    private BigDecimal max;
+
+    /**
+     * Create an instance of BigDecimalSummaryStatistics. {@code count = 0} and sum = {@link
+     * BigDecimal#ZERO}
+     */
+    public BigDecimalSummaryStatistics() {
+        this.count = 0;
+        this.sum = BigDecimal.ZERO;
+        this.max = null;
+        this.min = null;
+    }
+
+    /**
+     * Constructs a non-empty instance with the specified {@code count}, {@code min}, {@code max},
+     * and {@code sum}.
+     *
+     * <p>If {@code count} is zero then the remaining arguments are ignored and
+     * an empty instance is constructed.
+     *
+     * <p>If the arguments are inconsistent then an {@code IllegalArgumentException}
+     * is thrown. The necessary consistent argument conditions are:
+     * <ul>
+     * <li>{@code count >= 0}</li>
+     * <li>{@code min <= max}</li>
+     * </ul>
+     *
+     * @param count the count of values
+     * @param min the minimum value
+     * @param max the maximum value
+     * @param sum the sum of all values
+     * @throws IllegalArgumentException if the arguments are inconsistent or given with {@code
+     * null}.
+     */
+    public BigDecimalSummaryStatistics(long count, BigDecimal min, BigDecimal max,
+        BigDecimal sum) {
+
+        if (count < 0L) {
+            throw new IllegalArgumentException("count must be greater or equal to zero.");
+        } else if (count > 0L) {
+            if (min == null) {
+                throw new IllegalArgumentException("min is not allowed to be null.");
+            }
+            if (max == null) {
+                throw new IllegalArgumentException("max is not allowed to be null.");
+            }
+            if (sum == null) {
+                throw new IllegalArgumentException("sum is not allowed to be null.");
+            }
+
+            if (min.compareTo(max) > 0) {
+                throw new IllegalArgumentException("Minimum is greater than maximum.");
+            }
+
+            this.count = count;
+            this.sum = sum;
+
+            this.min = min;
+            this.max = max;
+        }
+
+    }
+
+    /**
+     * Records a new {@code BigDecimal} value into the summary information.
+     *
+     * @param value the input value
+     * @throws IllegalArgumentException in case of giving {@code null} for {@code value}.
+     */
+    @Override
+    public void accept(BigDecimal value) {
+        if (value == null) {
+            throw new IllegalArgumentException("value is not allowed to be null.");
+        }
+
+        count++;
+        sum = sum.add(value);
+
+        if (min == null) {
+            min = value;
+            max = value;
+        } else {
+            min = min.min(value);
+            max = max.max(value);
+        }
+    }
+
+    /**
+     * Combines the state of another {@code BigDecimalSummaryStatistics} into this one.
+     *
+     * @param other another {@code BigDecimalSummaryStatistics}
+     * @throws IllegalArgumentException in case of giving {@code null} for {@code value}.
+     */
+    public void combine(BigDecimalSummaryStatistics other) throws IllegalArgumentException {
+        if (other == null) {
+            throw new IllegalArgumentException("other is not allowed to be null.");
+        }
+
+        count += other.count;
+        sum = sum.add(other.sum);
+
+        if (min == null) {
+            min = other.min;
+            max = other.max;
+        } else {
+            min = min.min(other.min);
+            max = max.max(other.max);
+        }
+    }
+
+    /**
+     * Returns the count of values recorded.
+     *
+     * @return the count of values
+     */
+    public final long getCount() {
+        return count;
+    }
+
+    /**
+     * Returns the sum of values recorded, or zero if no values have been recorded.
+     *
+     * @return the sum of values, or zero if none
+     */
+    public final BigDecimal getSum() {
+        return sum;
+    }
+
+    /**
+     * Returns the minimum value recorded.
+     *
+     * @return The minimun which has been calculated.
+     * @throws IllegalStateException in case of {@code count=0}.
+     * @implSpec We can't give back a thing like Double#POSITIVE_INFINITY cause this can't be
+     * converted to a BigDecimal.
+     */
+    public final BigDecimal getMin() {
+        if (this.count == 0) {
+            throw new IllegalStateException(
+                "Minimum can not be calculated cause we have no values yet.");
+        }
+        return min;
+    }
+
+    /**
+     * Returns the maximum value recorded.
+     *
+     * @return the maximum value
+     * @throws IllegalStateException in case of {@code count=0}.
+     * @implSpec We can't give back a thing like Double#NEGATIVE_INFINITY cause this can't be
+     * converted to a BigDecimal.
+     */
+    public final BigDecimal getMax() {
+        if (this.count == 0) {
+            throw new IllegalStateException(
+                "Maximum can not be calculated cause we have no values yet.");
+        }
+        return max;
+    }
+
+    /**
+     * Returns the arithmetic mean of values recorded, or zero if no values have been recorded.
+     *
+     * @return The arithmetic mean of values, or zero if none
+     */
+    public final BigDecimal getAverage() {
+        if (this.count > 0) {
+            return this.sum.divide(BigDecimal.valueOf(this.count));
+        } else {
+            return BigDecimal.ZERO;
+        }
+    }
+
+    /**
+     * Returns a non-empty string representation of this object suitable for debugging. The exact
+     * presentation format is unspecified and may vary between implementations and versions.
+     */
+    @Override
+    public String toString() {
+        return String.format(
+            "%s{count=%s, sum=%s, min=%s, average=%s, max=%s}",
+            this.getClass()
+                .getSimpleName(),
+            getCount(),
+            getSum().toString(),
+            getMin().toString(),
+            getAverage().toString(),
+            getMax().toString()
+        );
+    }
+
+}
diff --git a/commons-statistics-bigdecimal/src/main/java/org/apache/commons/statistics/bigdecimal/descriptive/package-info.java b/commons-statistics-bigdecimal/src/main/java/org/apache/commons/statistics/bigdecimal/descriptive/package-info.java
new file mode 100644
index 0000000..bdb61f5
--- /dev/null
+++ b/commons-statistics-bigdecimal/src/main/java/org/apache/commons/statistics/bigdecimal/descriptive/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Implementations of common BigDecimal decriptive.
+ */
+package org.apache.commons.statistics.bigdecimal.descriptive;
diff --git a/commons-statistics-bigdecimal/src/site/resources/profile.jacoco b/commons-statistics-bigdecimal/src/site/resources/profile.jacoco
new file mode 100644
index 0000000..a12755f
--- /dev/null
+++ b/commons-statistics-bigdecimal/src/site/resources/profile.jacoco
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# -----------------------------------------------------------------------------
+#
+# Empty file used to automatically trigger JaCoCo profile from commons parent pom
diff --git a/commons-statistics-bigdecimal/src/test/java/org/apache/commons/statistics/bigdecimal/descriptive/BigDecimalSummaryStatisticsAssert.java b/commons-statistics-bigdecimal/src/test/java/org/apache/commons/statistics/bigdecimal/descriptive/BigDecimalSummaryStatisticsAssert.java
new file mode 100644
index 0000000..a71bee4
--- /dev/null
+++ b/commons-statistics-bigdecimal/src/test/java/org/apache/commons/statistics/bigdecimal/descriptive/BigDecimalSummaryStatisticsAssert.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.statistics.bigdecimal.descriptive;
+
+import org.assertj.core.api.AbstractAssert;
+
+public class BigDecimalSummaryStatisticsAssert extends
+    AbstractAssert<BigDecimalSummaryStatisticsAssert, BigDecimalSummaryStatistics> {
+
+    public BigDecimalSummaryStatisticsAssert(BigDecimalSummaryStatistics bigDecimalSummaryStatistics) {
+        super(bigDecimalSummaryStatistics, BigDecimalSummaryStatisticsAssert.class);
+    }
+
+    public static BigDecimalSummaryStatisticsAssert assertThat(BigDecimalSummaryStatistics actual) {
+        return new BigDecimalSummaryStatisticsAssert(actual);
+    }
+
+    public BigDecimalSummaryStatisticsAssert getAverage() {
+        isNotNull();
+        return myself;
+    }
+    public BigDecimalSummaryStatisticsAssert isEqualTo(BigDecimalSummaryStatistics expected) {
+
+        return null;
+    }
+
+//    public BigDecimalSummaryStatisticsAssert isCloseTo(Complex expected, float offset) {
+//        Assertions.assertThat(actual.getImaginary())
+//            .isCloseTo(expected.getImaginary(), Offset.offset(
+//                (double) offset));
+//        Assertions.assertThat(actual.getReal()).isCloseTo(expected.getReal(), Offset.offset(
+//            (double) offset));
+//        return myself;
+//    }
+//
+//    public BigDecimalSummaryStatisticsAssert withDelta(float delta) {
+//        myself.actual.getImaginary();
+//        return myself;
+//    }
+}
diff --git a/commons-statistics-bigdecimal/src/test/java/org/apache/commons/statistics/bigdecimal/descriptive/BigDecimalSummaryStatisticsTest.java b/commons-statistics-bigdecimal/src/test/java/org/apache/commons/statistics/bigdecimal/descriptive/BigDecimalSummaryStatisticsTest.java
new file mode 100644
index 0000000..6140a96
--- /dev/null
+++ b/commons-statistics-bigdecimal/src/test/java/org/apache/commons/statistics/bigdecimal/descriptive/BigDecimalSummaryStatisticsTest.java
@@ -0,0 +1,234 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.statistics.bigdecimal.descriptive;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
+
+import java.math.BigDecimal;
+import java.util.stream.LongStream;
+import org.assertj.core.data.Offset;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+/**
+ * The Unit Test for {@link BigDecimalSummaryStatistics}.
+ */
+@DisplayName("Unit Tests for BigDecimalSummaryStatistics")
+class BigDecimalSummaryStatisticsTest {
+
+    /**
+     * expected accuracy for results.
+     */
+    private static final Offset<Double> EPSILON = Offset.offset(1E-15d);
+
+    @Nested
+    @DisplayName("Constructor parameter validation test")
+    class ConstructorParameterTest {
+
+        @Test
+        @DisplayName("should fail if count is given less than zero.")
+        void shouldFailWithNegativeValueForCount() {
+            assertThatIllegalArgumentException()
+                .isThrownBy(() -> new BigDecimalSummaryStatistics(-1L, null, null, null))
+                .withMessage("count must be greater or equal to zero.");
+        }
+
+        @Test
+        @DisplayName("should fail if max is given null.")
+        void shouldFailWithNullForMin() {
+            assertThatIllegalArgumentException()
+                .isThrownBy(() -> new BigDecimalSummaryStatistics(1L, null, null, null))
+                .withMessage("min is not allowed to be null.");
+        }
+
+        @Test
+        @DisplayName("should fail if max is given null.")
+        void shouldFailWithNullForMax() {
+            assertThatIllegalArgumentException()
+                .isThrownBy(() -> new BigDecimalSummaryStatistics(1L, BigDecimal.ZERO, null, null))
+                .withMessage("max is not allowed to be null.");
+        }
+
+        @Test
+        @DisplayName("should fail if sum is given null.")
+        void shouldFailWithNullForSum() {
+            assertThatIllegalArgumentException()
+                .isThrownBy(
+                    () -> new BigDecimalSummaryStatistics(1L, BigDecimal.ZERO, BigDecimal.TEN,
+                        null))
+                .withMessage("sum is not allowed to be null.");
+        }
+
+        @Test
+        @DisplayName("should fail if min is greater than max.")
+        void shouldFailForMinGreaterThanMax() {
+            assertThatIllegalArgumentException()
+                .isThrownBy(
+                    () -> new BigDecimalSummaryStatistics(1L, BigDecimal.ONE, BigDecimal.ZERO,
+                        BigDecimal.ZERO))
+                .withMessage("Minimum is greater than maximum.");
+        }
+    }
+
+    @Nested
+    @DisplayName("Parameter test for method")
+    class ParameterTest {
+
+        private BigDecimalSummaryStatistics bigDecimalSummaryStatistics;
+
+        @BeforeEach
+        void beforeEach() {
+            this.bigDecimalSummaryStatistics = new BigDecimalSummaryStatistics();
+        }
+
+        @Test
+        @DisplayName("accept should fail if given null")
+        void acceptShouldFailWhileGivingNull() {
+            assertThatIllegalArgumentException()
+                .isThrownBy(
+                    () -> this.bigDecimalSummaryStatistics.accept(null))
+                .withMessage("value is not allowed to be null.");
+        }
+
+        @Test
+        @DisplayName("combine should fail if given null")
+        void combineShouldFailWhileGivingNull() {
+            assertThatIllegalArgumentException()
+                .isThrownBy(
+                    () -> this.bigDecimalSummaryStatistics.combine(null))
+                .withMessage("other is not allowed to be null.");
+        }
+
+        @Test
+        @DisplayName("average should result in Zero if no values have been provided.")
+        void averageShouldResultInZeroWhenNoValuesHaveBeenProvided() {
+            assertThat(this.bigDecimalSummaryStatistics.getAverage()).isEqualTo(BigDecimal.ZERO);
+        }
+
+        @Test
+        @DisplayName("count should result in zero if no values have been provided.")
+        void countShouldResultInZeroWhenNoValuesHaveBeenProvided() {
+            assertThat(this.bigDecimalSummaryStatistics.getCount()).isEqualTo(0L);
+        }
+
+        @Test
+        @DisplayName("sum should result in zero if no values have been provided.")
+        void sumShouldResultInZeroWhenNoValuesHaveBeenProvided() {
+            assertThat(this.bigDecimalSummaryStatistics.getSum()).isEqualTo(BigDecimal.ZERO);
+        }
+
+        @Test
+        @DisplayName("min should result in exception if no values have been provided.")
+        void minShouldResultInIllegalStateExceptionWhenNoValuesHaveBeenProvided() {
+            assertThatIllegalStateException()
+                .isThrownBy(() -> this.bigDecimalSummaryStatistics.getMin())
+                .withMessage("Minimum can not be calculated cause we have no values yet.");
+        }
+
+        @Test
+        @DisplayName("max should result in exception if no values have been provided.")
+        void maxShouldResultInIllegalArgumentExceptionWhenNoValuesHaveBeenProvided() {
+            assertThatIllegalStateException()
+                .isThrownBy(() -> this.bigDecimalSummaryStatistics.getMax())
+                .withMessage("Maximum can not be calculated cause we have no values yet.");
+        }
+    }
+
+    @Nested
+    @DisplayName("Edge case test")
+    class EdgeCaseTest {
+
+        @Test
+        @DisplayName("statistics for one element.")
+        void summaryStatisticsForOneElement() {
+            BigDecimalSummaryStatistics collect =
+                LongStream.rangeClosed(1, 1)
+                    .mapToObj(BigDecimal::valueOf)
+                    .collect(BigDecimalSummaryStatistics::new,
+                        BigDecimalSummaryStatistics::accept,
+                        BigDecimalSummaryStatistics::combine);
+
+            assertThat(collect.getCount()).isEqualTo(1L);
+            assertThat(collect.getAverage()).isEqualTo(BigDecimal.ONE);
+            assertThat(collect.getMin()).isEqualTo(BigDecimal.ONE);
+            assertThat(collect.getMax()).isEqualTo(BigDecimal.ONE);
+            assertThat(collect.getSum()).isEqualTo(BigDecimal.ONE);
+        }
+
+        @Test
+        @DisplayName("statistics for elements 1..10.")
+        void summaryStatisticsForOneToTen() {
+            BigDecimalSummaryStatistics collect =
+                LongStream.rangeClosed(1, 10)
+                    .mapToObj(BigDecimal::valueOf)
+                    .collect(BigDecimalSummaryStatistics::new,
+                        BigDecimalSummaryStatistics::accept,
+                        BigDecimalSummaryStatistics::combine);
+
+            assertThat(collect.getCount()).isEqualTo(10L);
+            assertThat(collect.getAverage().doubleValue()).isEqualTo(5.5d, EPSILON);
+//        BigDecimalSummaryStatisticsAssert.assertThat(collect).getAverage().isEqualTo(5.5d, EPSILON);
+            assertThat(collect.getSum().doubleValue()).isEqualTo(55d, EPSILON);
+            assertThat(collect.getMin()).isEqualTo(BigDecimal.ONE);
+            assertThat(collect.getMax()).isEqualTo(BigDecimal.TEN);
+
+        }
+
+        @Test
+        @DisplayName("statistics for elements 1..42.")
+        void summaryStatisticsForOneToFourtyTwo() {
+            BigDecimalSummaryStatistics collect =
+                LongStream.rangeClosed(1, 42)
+                    .mapToObj(BigDecimal::valueOf)
+                    .collect(BigDecimalSummaryStatistics::new,
+                        BigDecimalSummaryStatistics::accept,
+                        BigDecimalSummaryStatistics::combine);
+
+            assertThat(collect.getCount()).isEqualTo(42L);
+            assertThat(collect.getAverage().doubleValue()).isEqualTo(21.5d, EPSILON);
+//        BigDecimalSummaryStatisticsAssert.assertThat(collect).getAverage().isEqualTo(5.5d, EPSILON);
+            assertThat(collect.getSum().doubleValue()).isEqualTo(903d, EPSILON);
+            assertThat(collect.getMin()).isEqualTo(BigDecimal.ONE);
+            assertThat(collect.getMax()).isEqualTo(BigDecimal.valueOf(42));
+
+        }
+
+        @Test
+        @DisplayName("statistics for elements 1..1_234_567.")
+        void summaryStatisticsForOneTXXXX() {
+            BigDecimalSummaryStatistics collect =
+                LongStream.rangeClosed(1, 1_234_567)
+                    .mapToObj(BigDecimal::valueOf)
+                    .collect(BigDecimalSummaryStatistics::new,
+                        BigDecimalSummaryStatistics::accept,
+                        BigDecimalSummaryStatistics::combine);
+
+            assertThat(collect.getCount()).isEqualTo(1_234_567L);
+            assertThat(collect.getAverage().doubleValue()).isEqualTo(617_284d, EPSILON);
+//        BigDecimalSummaryStatisticsAssert.assertThat(collect).getAverage().isEqualTo(5.5d, EPSILON);
+            assertThat(collect.getSum().doubleValue()).isEqualTo(762_078_456_028d, EPSILON);
+            assertThat(collect.getMin()).isEqualTo(BigDecimal.ONE);
+            assertThat(collect.getMax()).isEqualTo(BigDecimal.valueOf(1_234_567));
+
+        }
+    }
+
+}
diff --git a/pom.xml b/pom.xml
index 1d0bd58..47d5868 100644
--- a/pom.xml
+++ b/pom.xml
@@ -626,6 +626,7 @@
   <modules>
     <module>commons-statistics-distribution</module>
     <module>commons-statistics-regression</module>
+    <module>commons-statistics-bigdecimal</module>
   </modules>
 
 </project>