Add first test and correct some bugs

This commit is contained in:
Nicolas Duhamel 2022-10-23 14:34:56 +02:00
parent 6821828033
commit b07e2829c6
3 changed files with 166 additions and 17 deletions

24
pkg/device/device_test.go Normal file
View File

@ -0,0 +1,24 @@
package device
import (
"testing"
)
var goodDefaultDevice = Device {
Name: "valid",
Settings: DefaultDeviceSettings,
CurrentSetpoint: 0,
State: DeviceState{},
}
func TestStateTopic(t *testing.T) {
topic := goodDefaultDevice.StateTopic()
if topic != "heater/valid/state" {
t.Errorf("Got %s; want heater/valid/state", topic)
}
}
func TestCheckSetpoint(t *testing.T) {
}

View File

@ -23,26 +23,24 @@ func (d DayOfWeek) Previous() DayOfWeek {
return d-1
}
func (d DayOfWeek) DurationBetween(n DayOfWeek) time.Duration {
// return duration between two day of week
var duration time.Duration
if (d-n == 0) {
duration, _ = time.ParseDuration("168h")
func (d DayOfWeek) DaysBetween(n DayOfWeek) int {
var between int
if (n < d) {
between = 7 - int(d-n)
} else {
duration, _ = time.ParseDuration(fmt.Sprintf("%dh", (d-n)*24 ))
between = int(n-d)
}
return duration
return between
}
const (
Monday DayOfWeek = 0
Thuesday = 1
Wednesday = 2
Thursday = 3
Friday = 4
Saturday = 5
Sunday = 6
Monday DayOfWeek = 0
Thuesday DayOfWeek = 1
Wednesday DayOfWeek = 2
Thursday DayOfWeek = 3
Friday DayOfWeek = 4
Saturday DayOfWeek = 5
Sunday DayOfWeek = 6
)
func WeekDayEnToFr(weekday time.Weekday) DayOfWeek {
@ -77,6 +75,8 @@ type Setpoint struct {
Preset_id int `json:"preset_id"`
}
type WeekProgram map[DayOfWeek][]Setpoint
func (p WeekProgram) Current() Setpoint {
@ -119,8 +119,9 @@ func (p WeekProgram) NextTime(t time.Time) (time.Time, error) {
setpoint = get(weekday, daytime)
if (setpoint != Setpoint{}) {
// setpoint found, compute time
next := t.Add( startweekday.DurationBetween(weekday) )
next = t.Add( time.Duration(setpoint.Start - daytime ) * time.Minute )
next := time.Date(t.Year(), t.Month(), t.Day() + startweekday.DaysBetween(weekday), 0, 0, 0, 0, time.Local)
next = next.Add(time.Duration( (setpoint.Start) * int(time.Minute) ))
return next, nil
}
weekday = weekday.Next()
@ -204,3 +205,45 @@ type DeviceSettings struct {
Presets []Preset `json:"presets"`
TVR TVRSettings `json:"TVR"`
}
//////////////////////////////////////////////
// Defaults
var DefaultPresets = []Preset{
{Label: "default", Value: 17, Color: "#012a36"},
{Label: "normal", Value: 19, Color: "#b6244f"},
}
var defaultSetpoints = []Setpoint{
{Start: 7*60, Preset_id: 1},
{Start: 8*60, Preset_id: 0},
{Start: 16*60, Preset_id: 1},
{Start: 22*60, Preset_id: 0},
}
var DefaultWeekProgram = WeekProgram{
Monday: defaultSetpoints,
Thuesday: defaultSetpoints,
Wednesday: defaultSetpoints,
Thursday : defaultSetpoints,
Friday: defaultSetpoints,
Saturday: defaultSetpoints,
Sunday: defaultSetpoints,
}
var DefaultPrograms = Programs{
"default": DefaultWeekProgram,
}
var DefaultTVRSettings = TVRSettings {
Setpoint_topic : "zigbee2mqtt/TVR/{{.Device}}/set",
Setpoint_payload : "{\"current_heating_setpoint\": {{.Setpoint}}}",
Setpoint_state_topic : "zigbee2mqtt/TVR/{{.Device}}",
Setpoint_state_jp : "$.current_heating_setpoint",
}
var DefaultDeviceSettings = DeviceSettings{
Programs: DefaultPrograms,
Presets: DefaultPresets,
TVR: DefaultTVRSettings,
}

View File

@ -0,0 +1,82 @@
package device
import (
"testing"
"time"
"fmt"
)
func TestDaysBetween(t *testing.T) {
var tests = []struct{
day1 DayOfWeek
day2 DayOfWeek
want int
}{
{ Monday, Thuesday, 1 },
{ Thuesday, Monday, 6 },
{ Sunday, Monday, 1 },
{ Sunday, Thuesday, 2 },
{ Friday, Friday, 0 },
}
for _, tt := range tests {
testname := fmt.Sprintf("Days between %d and %d", tt.day1, tt.day2 )
t.Run(testname, func(t *testing.T) {
between := tt.day1.DaysBetween(tt.day2)
if between != tt.want {
t.Errorf("got %d, want %d", between, tt.want)
}
})
}
}
func TestNextTime(t *testing.T) {
defaultSetpoints := []Setpoint{
{Start: 7*60, Preset_id: 1},
{Start: 8*60, Preset_id: 0},
{Start: 16*60, Preset_id: 1},
{Start: 22*60, Preset_id: 0},
}
program := WeekProgram{
Monday: defaultSetpoints,
Thuesday: defaultSetpoints,
Wednesday: defaultSetpoints,
Thursday : defaultSetpoints,
Friday: defaultSetpoints,
Saturday: defaultSetpoints,
Sunday: defaultSetpoints,
}
var tests = []struct{
time time.Time
want time.Time
}{
{
time.Date(2022, time.October, 23, 9, 0, 0, 0, time.Local),
time.Date(2022, time.October, 23, 16, 0, 0, 0, time.Local),
},
{
time.Date(2022, time.October, 24, 5, 0, 0, 0, time.Local),
time.Date(2022, time.October, 24, 7, 0, 0, 0, time.Local),
},
{
time.Date(2022, time.October, 23, 23, 0, 0, 0, time.Local),
time.Date(2022, time.October, 24, 7, 0, 0, 0, time.Local),
},
}
for _, tt := range tests {
testname := fmt.Sprintf("%s", tt.time.String() )
t.Run(testname, func(t *testing.T) {
next, err := program.NextTime(tt.time)
if err != nil {
t.Fatalf("unexpected error")
}
if !next.Equal(tt.want) {
t.Errorf("got %s, want %s", next.String(), tt.want.String())
}
})
}
}