aboutsummaryrefslogtreecommitdiff
path: root/src/main/go/AlexanderYastrebov/calc_test.go
diff options
context:
space:
mode:
authorAlexander Yastrebov <yastrebov.alex@gmail.com>2024-01-23 20:49:28 +0100
committerGitHub <noreply@github.com>2024-01-23 20:49:28 +0100
commit4daeb94b048e074c2b80aac1074b68eb92285ea8 (patch)
treedcb34aeb870a49c0c45b04919b7c4bedfc4f9dc7 /src/main/go/AlexanderYastrebov/calc_test.go
parent464ba6209bb229f45e43693801ec5814d8815760 (diff)
Go implementation by AlexanderYastrebov (#298)
* Go implementation by AlexanderYastrebov This is a proof-of-concept to demonstrate non-java submission. It requires Docker with BuildKit plugin to build and export binary. Updates * #67 * #253 * Use collision-free id lookup * Use number of buckets greater than max number of keys
Diffstat (limited to 'src/main/go/AlexanderYastrebov/calc_test.go')
-rw-r--r--src/main/go/AlexanderYastrebov/calc_test.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/main/go/AlexanderYastrebov/calc_test.go b/src/main/go/AlexanderYastrebov/calc_test.go
new file mode 100644
index 0000000..db7e27a
--- /dev/null
+++ b/src/main/go/AlexanderYastrebov/calc_test.go
@@ -0,0 +1,86 @@
+package main
+
+import (
+ "fmt"
+ "os"
+ "testing"
+)
+
+func TestRoundJava(t *testing.T) {
+ for _, tc := range []struct {
+ value float64
+ expected string
+ }{
+ {value: -1.5, expected: "-1.0"},
+ {value: -1.0, expected: "-1.0"},
+ {value: -0.7, expected: "-1.0"},
+ {value: -0.5, expected: "0.0"},
+ {value: -0.3, expected: "0.0"},
+ {value: 0.0, expected: "0.0"},
+ {value: 0.3, expected: "0.0"},
+ {value: 0.5, expected: "1.0"},
+ {value: 0.7, expected: "1.0"},
+ {value: 1.0, expected: "1.0"},
+ {value: 1.5, expected: "2.0"},
+ } {
+ if rounded := roundJava(tc.value); fmt.Sprintf("%.1f", rounded) != tc.expected {
+ t.Errorf("Wrong rounding of %v, expected: %s, got: %.1f", tc.value, tc.expected, rounded)
+ }
+ }
+}
+
+func TestParseNumber(t *testing.T) {
+ for _, tc := range []struct {
+ value string
+ expected string
+ }{
+ {value: "-99.9", expected: "-999"},
+ {value: "-12.3", expected: "-123"},
+ {value: "-1.5", expected: "-15"},
+ {value: "-1.0", expected: "-10"},
+ {value: "0.0", expected: "0"},
+ {value: "0.3", expected: "3"},
+ {value: "12.3", expected: "123"},
+ {value: "99.9", expected: "999"},
+ } {
+ if number := parseNumber([]byte(tc.value)); fmt.Sprintf("%d", number) != tc.expected {
+ t.Errorf("Wrong parsing of %v, expected: %s, got: %d", tc.value, tc.expected, number)
+ }
+ }
+}
+
+var parseNumberSink int64
+
+func BenchmarkParseNumber(b *testing.B) {
+ data1 := []byte("1.2")
+ data2 := []byte("-12.3")
+
+ for i := 0; i < b.N; i++ {
+ parseNumberSink = parseNumber(data1) + parseNumber(data2)
+ }
+}
+
+func BenchmarkProcess(b *testing.B) {
+ // $ ./create_measurements.sh 1000000 && mv measurements.txt measurements-1e6.txt
+ // Created file with 1,000,000 measurements in 514 ms
+ const filename = "../../../../measurements-1e6.txt"
+
+ data, err := os.ReadFile(filename)
+ if err != nil {
+ b.Fatal(err)
+ }
+
+ measurements := process(data)
+ rows := int64(0)
+ for _, m := range measurements {
+ rows += m.count
+ }
+
+ b.ReportAllocs()
+ b.ResetTimer()
+ b.ReportMetric(float64(rows), "rows/op")
+
+ for i := 0; i < b.N; i++ {
+ process(data)
+ }
+}