1
0
mirror of https://github.com/MontFerret/ferret.git synced 2024-12-14 11:23:02 +02:00
ferret/pkg/stdlib/datetime/add_subtract_test.go

295 lines
6.7 KiB
Go

package datetime_test
import (
"context"
"testing"
"time"
"github.com/MontFerret/ferret/pkg/runtime/core"
"github.com/MontFerret/ferret/pkg/runtime/values"
"github.com/MontFerret/ferret/pkg/stdlib/datetime"
)
var (
utcLoc, _ = time.LoadLocation("UTC")
)
func TestDateAdd(t *testing.T) {
tcs := []*testCase{
&testCase{
Name: "When more than 3 arguments",
Expected: values.None,
Args: []core.Value{
values.NewInt(0),
values.NewInt(0),
values.NewInt(0),
values.NewInt(0),
},
ShouldErr: true,
},
&testCase{
Name: "When less than 3 arguments",
Expected: values.None,
Args: []core.Value{
values.NewInt(0),
},
ShouldErr: true,
},
&testCase{
Name: "When incorrect arguments",
Expected: values.None,
Args: []core.Value{
values.NewString("bla-bla"),
values.NewInt(0),
values.NewString("be-be"),
},
ShouldErr: true,
},
&testCase{
Name: "When wrong unit given",
Expected: values.None,
Args: []core.Value{
mustLayoutDt("2006-01-02", "1999-02-07"),
values.NewInt(5),
values.NewString("not_exist"),
},
ShouldErr: true,
},
&testCase{
Name: "When argument have correct types",
Expected: func() core.Value {
expected, _ := datetime.DateAdd(
context.Background(),
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(1),
values.NewString("day"),
)
return expected
}(),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(1),
values.NewString("day"),
},
},
&testCase{
Name: "-1 day",
Expected: mustDefaultLayoutDt("1999-02-06T15:04:05Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(-1),
values.NewString("day"),
},
},
&testCase{
Name: "+3 months",
Expected: mustDefaultLayoutDt("1999-05-07T15:04:05Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(3),
values.NewString("months"),
},
},
&testCase{
Name: "+5 years",
Expected: mustLayoutDt("2006-01-02", "2004-02-07"),
Args: []core.Value{
mustLayoutDt("2006-01-02", "1999-02-07"),
values.NewInt(5),
values.NewString("y"),
},
},
&testCase{
Name: "1999 minus 2000 years",
Expected: values.NewDateTime(
time.Date(-1, 2, 7, 0, 0, 0, 0, utcLoc),
),
Args: []core.Value{
mustLayoutDt("2006-01-02", "1999-02-07"),
values.NewInt(-2000),
values.NewString("year"),
},
},
&testCase{
Name: "+2 hours",
Expected: mustDefaultLayoutDt("1999-02-07T17:04:05Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(2),
values.NewString("h"),
},
},
&testCase{
Name: "+20 minutes",
Expected: mustDefaultLayoutDt("1999-02-07T15:24:05Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(20),
values.NewString("i"),
},
},
&testCase{
Name: "+30 seconds",
Expected: mustDefaultLayoutDt("1999-02-07T15:04:35Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(30),
values.NewString("s"),
},
},
&testCase{
Name: "+1000 milliseconds",
Expected: mustDefaultLayoutDt("1999-02-07T15:04:06Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(1000),
values.NewString("f"),
},
},
}
for _, tc := range tcs {
tc.Do(t, datetime.DateAdd)
}
}
func TestDateSubtract(t *testing.T) {
tcs := []*testCase{
&testCase{
Name: "When more than 3 arguments",
Expected: values.None,
Args: []core.Value{
values.NewInt(0),
values.NewInt(0),
values.NewInt(0),
values.NewInt(0),
},
ShouldErr: true,
},
&testCase{
Name: "When less than 3 arguments",
Expected: values.None,
Args: []core.Value{
values.NewInt(0),
},
ShouldErr: true,
},
&testCase{
Name: "When incorrect arguments",
Expected: values.None,
Args: []core.Value{
values.NewString("bla-bla"),
values.NewInt(0),
values.NewString("be-be"),
},
ShouldErr: true,
},
&testCase{
Name: "When wrong unit given",
Expected: values.None,
Args: []core.Value{
mustLayoutDt("2006-01-02", "1999-02-07"),
values.NewInt(5),
values.NewString("not_exist"),
},
ShouldErr: true,
},
&testCase{
Name: "When argument have correct types",
Expected: func() core.Value {
expected, _ := datetime.DateSubtract(
context.Background(),
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(1),
values.NewString("day"),
)
return expected
}(),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(1),
values.NewString("day"),
},
},
&testCase{
Name: "-1 day",
Expected: mustDefaultLayoutDt("1999-02-08T15:04:05Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(-1),
values.NewString("day"),
},
},
&testCase{
Name: "+3 months",
Expected: mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-05-07T15:04:05Z"),
values.NewInt(3),
values.NewString("months"),
},
},
&testCase{
Name: "+5 years",
Expected: mustLayoutDt("2006-01-02", "1994-02-07"),
Args: []core.Value{
mustLayoutDt("2006-01-02", "1999-02-07"),
values.NewInt(5),
values.NewString("y"),
},
},
&testCase{
Name: "1999 minus 2000 years",
Expected: values.NewDateTime(
time.Date(-1, 2, 7, 0, 0, 0, 0, utcLoc),
),
Args: []core.Value{
mustLayoutDt("2006-01-02", "1999-02-07"),
values.NewInt(2000),
values.NewString("year"),
},
},
&testCase{
Name: "-2 hours",
Expected: mustDefaultLayoutDt("1999-02-07T13:04:05Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(2),
values.NewString("h"),
},
},
&testCase{
Name: "-20 minutes",
Expected: mustDefaultLayoutDt("1999-02-07T14:44:05Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(20),
values.NewString("i"),
},
},
&testCase{
Name: "-30 seconds",
Expected: mustDefaultLayoutDt("1999-02-07T15:03:35Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(30),
values.NewString("s"),
},
},
&testCase{
Name: "-1000 milliseconds",
Expected: mustDefaultLayoutDt("1999-02-07T15:04:04Z"),
Args: []core.Value{
mustDefaultLayoutDt("1999-02-07T15:04:05Z"),
values.NewInt(1000),
values.NewString("f"),
},
},
}
for _, tc := range tcs {
tc.Do(t, datetime.DateSubtract)
}
}