1
0
mirror of https://github.com/MontFerret/ferret.git synced 2024-12-16 11:37:36 +02:00
ferret/pkg/stdlib/datetime/diff_test.go
2018-11-13 16:58:40 -05:00

179 lines
4.2 KiB
Go

package datetime_test
import (
"testing"
"time"
"github.com/MontFerret/ferret/pkg/runtime/values"
"github.com/MontFerret/ferret/pkg/runtime/core"
"github.com/MontFerret/ferret/pkg/stdlib/datetime"
)
var (
isFloat = values.NewBoolean(true)
beginingEpoch = values.NewDateTime(time.Time{})
)
func TestDiff(t *testing.T) {
tcs := []*testCase{
&testCase{
Name: "when less then 3 arguments",
Expected: values.NewInt(1),
Args: []core.Value{beginingEpoch},
ShouldErr: true,
},
&testCase{
Name: "when more then 4 arguments",
Expected: values.NewInt(1),
Args: []core.Value{beginingEpoch, beginingEpoch, beginingEpoch, beginingEpoch, beginingEpoch},
ShouldErr: true,
},
&testCase{
Name: "when wrong type argument",
Expected: values.NewInt(1),
Args: []core.Value{beginingEpoch, beginingEpoch, beginingEpoch},
ShouldErr: true,
},
&testCase{
Name: "when the difference is 1 year and 1 month (int)",
Expected: values.NewInt(1),
Args: []core.Value{
beginingEpoch,
values.NewDateTime(
beginingEpoch.AddDate(1, 1, 0),
),
values.NewString("y"),
},
},
&testCase{
Name: "when the difference is 1 year and 1 month (float)",
Expected: values.NewFloat(1.084931506849315),
Args: []core.Value{
beginingEpoch,
values.NewDateTime(
beginingEpoch.AddDate(1, 1, 0),
),
values.NewString("year"),
isFloat,
},
},
&testCase{
Name: "when date1 after date2 (int)",
Expected: values.NewInt(2),
Args: []core.Value{
beginingEpoch,
values.NewDateTime(
beginingEpoch.Add(-time.Hour * 48),
),
values.NewString("d"),
},
},
&testCase{
Name: "when date1 after date2 (float)",
Expected: values.NewFloat(2),
Args: []core.Value{
beginingEpoch,
values.NewDateTime(
beginingEpoch.Add(-time.Hour * 48),
),
values.NewString("d"),
isFloat,
},
},
&testCase{
Name: "when dates are equal (int)",
Expected: values.NewInt(0),
Args: []core.Value{
beginingEpoch,
beginingEpoch,
values.NewString("i"),
},
},
&testCase{
Name: "when dates are equal (float)",
Expected: values.NewFloat(0),
Args: []core.Value{
beginingEpoch,
beginingEpoch,
values.NewString("y"),
isFloat,
},
},
}
bigUnits := map[string][3]int{
"y": [3]int{1, 0, 0}, "year": [3]int{1, 0, 0}, "years": [3]int{1, 0, 0},
"m": [3]int{0, 1, 0}, "month": [3]int{0, 1, 0}, "months": [3]int{0, 1, 0},
"w": [3]int{0, 0, 7}, "week": [3]int{0, 0, 7}, "weeks": [3]int{0, 0, 7},
"d": [3]int{0, 0, 1}, "day": [3]int{0, 0, 1}, "days": [3]int{0, 0, 1},
}
for unit, dates := range bigUnits {
tcs = append(tcs,
&testCase{
Name: "When difference is 1 " + unit + " (int)",
Expected: values.NewInt(1),
Args: []core.Value{
beginingEpoch,
values.NewDateTime(
beginingEpoch.AddDate(dates[0], dates[1], dates[2]),
),
values.NewString(unit),
},
},
&testCase{
Name: "When difference is 1 " + unit + " (float)",
Expected: values.NewFloat(1),
Args: []core.Value{
beginingEpoch,
values.NewDateTime(
beginingEpoch.AddDate(dates[0], dates[1], dates[2]),
),
values.NewString(unit),
isFloat,
},
},
)
}
units := map[string]time.Duration{
"h": time.Hour, "hour": time.Hour, "hours": time.Hour,
"i": time.Minute, "minute": time.Minute, "minutes": time.Minute,
"s": time.Second, "second": time.Second, "seconds": time.Second,
"f": time.Millisecond, "millisecond": time.Millisecond, "milliseconds": time.Millisecond,
}
for unit, durn := range units {
tcs = append(tcs,
&testCase{
Name: "When difference is 1 " + unit + " (int)",
Expected: values.NewInt(1),
Args: []core.Value{
beginingEpoch,
values.NewDateTime(
beginingEpoch.Add(durn),
),
values.NewString(unit),
},
},
&testCase{
Name: "When difference is 1 " + unit + " (int)",
Expected: values.NewFloat(1),
Args: []core.Value{
beginingEpoch,
values.NewDateTime(
beginingEpoch.Add(durn),
),
values.NewString(unit),
isFloat,
},
},
)
}
for _, tc := range tcs {
tc.Do(t, datetime.DateDiff)
}
}