Skip to content

Instantly share code, notes, and snippets.

@petrkotek
Created December 30, 2016 15:14
Show Gist options
  • Save petrkotek/7c9adb2e1421abbf8bf437ebe67caa32 to your computer and use it in GitHub Desktop.
Save petrkotek/7c9adb2e1421abbf8bf437ebe67caa32 to your computer and use it in GitHub Desktop.
Combining (Aggregating/Adding/Subtracting) ranges in Golang - test coverage
package ranges_test
// tests for https://gist.github.com/petrkotek/317dbcf6a73387682bc8d899b09c36df
import (
"bitbucket.org/kayakrent/booking-api/lib/ranges"
"math"
"reflect"
"testing"
)
func TestStandardAggregator_Aggregate(t *testing.T) {
aggregator := ranges.StandardAggregator{}
table := []struct {
name string
input []*ranges.Range
expectedOutput []*ranges.Range
expectedError error
}{
{
name: "empty range",
input: []*ranges.Range{},
expectedOutput: []*ranges.Range{},
expectedError: nil,
},
{
name: "single range 1",
input: []*ranges.Range{
{From: 0, To: 10, Value: 1},
},
expectedOutput: []*ranges.Range{
{From: 0, To: 10, Value: 1},
},
expectedError: nil,
},
{
name: "single range 2",
input: []*ranges.Range{
{From: -10, To: -5, Value: -5},
},
expectedOutput: []*ranges.Range{
{From: -10, To: -5, Value: -5},
},
expectedError: nil,
},
{
name: "single range 3",
input: []*ranges.Range{
{From: math.MinInt64, To: math.MaxInt64, Value: 1},
},
expectedOutput: []*ranges.Range{
{From: math.MinInt64, To: math.MaxInt64, Value: 1},
},
expectedError: nil,
},
{
name: "two unconnected ranges",
input: []*ranges.Range{
{From: 0, To: 10, Value: 1},
{From: 20, To: 30, Value: 2},
},
expectedOutput: []*ranges.Range{
{From: 0, To: 10, Value: 1},
{From: 20, To: 30, Value: 2},
},
expectedError: nil,
},
{
name: "two overlapping ranges 1 (right)",
input: []*ranges.Range{
{From: 0, To: 20, Value: 1},
{From: 10, To: 30, Value: 2},
},
expectedOutput: []*ranges.Range{
{From: 0, To: 10, Value: 1},
{From: 10, To: 20, Value: 3},
{From: 20, To: 30, Value: 2},
},
expectedError: nil,
},
{
name: "two overlapping ranges 2 (middle)",
input: []*ranges.Range{
{From: 0, To: 20, Value: 1},
{From: 5, To: 15, Value: 2},
},
expectedOutput: []*ranges.Range{
{From: 0, To: 5, Value: 1},
{From: 5, To: 15, Value: 3},
{From: 15, To: 20, Value: 1},
},
expectedError: nil,
},
{
name: "two overlapping ranges 3 (left)",
input: []*ranges.Range{
{From: 0, To: 20, Value: 1},
{From: -10, To: 10, Value: 2},
},
expectedOutput: []*ranges.Range{
{From: -10, To: 0, Value: 2},
{From: 0, To: 10, Value: 3},
{From: 10, To: 20, Value: 1},
},
expectedError: nil,
},
{
name: "two overlapping ranges 4 (shared from)",
input: []*ranges.Range{
{From: 0, To: 20, Value: 1},
{From: 0, To: 10, Value: 2},
},
expectedOutput: []*ranges.Range{
{From: 0, To: 10, Value: 3},
{From: 10, To: 20, Value: 1},
},
expectedError: nil,
},
{
name: "two overlapping ranges 2 (same)",
input: []*ranges.Range{
{From: 0, To: 10, Value: 1},
{From: 0, To: 10, Value: 2},
},
expectedOutput: []*ranges.Range{
{From: 0, To: 10, Value: 3},
},
expectedError: nil,
},
{
name: "combining neighbor ranges 1",
input: []*ranges.Range{
{From: 10, To: 20, Value: 1},
{From: 20, To: 30, Value: 1},
},
expectedOutput: []*ranges.Range{
{From: 10, To: 30, Value: 1},
},
expectedError: nil,
},
}
for _, row := range table {
output, err := aggregator.Aggregate(row.input)
if err != row.expectedError {
t.Errorf("Aggregate(%s) returned unexpected error", row.name)
}
if !reflect.DeepEqual(row.expectedOutput, output) {
t.Errorf("Aggregate(%s) returned unexpected output", row.name)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment