This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/develop by this push:
new af33841524 test(plc4go/cbus): finish tests for TagHandler
af33841524 is described below
commit af3384152448c66af793384cbfed7ad2489330f0
Author: Sebastian Rühl <[email protected]>
AuthorDate: Tue Apr 4 17:16:25 2023 +0200
test(plc4go/cbus): finish tests for TagHandler
---
plc4go/internal/cbus/TagHandler.go | 8 +-
plc4go/internal/cbus/TagHandler_test.go | 712 ++++++++++++++++++++++++++++----
2 files changed, 631 insertions(+), 89 deletions(-)
diff --git a/plc4go/internal/cbus/TagHandler.go
b/plc4go/internal/cbus/TagHandler.go
index 272960c3ec..5da0695fbf 100644
--- a/plc4go/internal/cbus/TagHandler.go
+++ b/plc4go/internal/cbus/TagHandler.go
@@ -67,7 +67,7 @@ type TagHandler struct {
func NewTagHandler() TagHandler {
return TagHandler{
statusRequestPattern:
regexp.MustCompile(`^status/(?:(?P<bridges>b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})(?:-b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})){0,5})/)?(?P<statusRequestType>(?P<binary>binary)|level=0x(?P<startingGroupAddressLabel>00|20|40|60|80|A0|C0|E0))/(?P<application>.*)$`),
- calPattern:
regexp.MustCompile(`^cal/(?:(?P<bridges>b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})(?:-b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})){0,5})-)?(?P<unitAddress>u?(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3}))/(?P<calType>reset|recall=\[(?P<recallParamNo>\w+),
?(?P<recallCount>\d+)]|identify=(?P<identifyAttribute>\w+)|getStatus=(?P<getStatusParamNo>\w+),
?(?P<getStatusCount>\d+)|write=\[(?P<writeParamNo>\w+),
?(?P<writeCode>0[xX][0-9a-fA-F][0-9a-fA-F])]|identifyReply=(?P<replyAttribute>\w+)|r
[...]
+ calPattern:
regexp.MustCompile(`^cal/(?:(?P<bridges>b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})(?:-b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})){0,5})-)?(?P<unitAddress>u?(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3}))/(?P<calType>reset|recall=\[(?P<recallParamNo>(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})),
?(?P<recallCount>\d+)]|identify=(?P<identifyAttribute>\w+)|getStatus=(?P<getStatusParamNo>\w+),
?(?P<getStatusCount>\d+)|write=\[(?P<writeParamNo>\w+),
?(?P<writeCode>0[xX][0-9a-fA-F][0-9a-fA-F])]|identif [...]
salPattern:
regexp.MustCompile(`^sal/(?:(?P<bridges>b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})(?:-b(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3})){0,5})/)?(?P<application>.*)/(?P<salCommand>.*)$`),
salMonitorPattern:
regexp.MustCompile(`^salmonitor/(?P<unitAddress>u?(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3}|\*))/(?P<application>.+|\*)$`),
mmiMonitorPattern:
regexp.MustCompile(`^mmimonitor/(?P<unitAddress>u?(?:(?:0x)?[A-Fa-f0-9]{1,2}|\d{1,3}|\*))/(?P<application>.+|\*)$`),
@@ -144,8 +144,7 @@ func (m TagHandler) handleStatusRequestPattern(match
map[string]string) (apiMode
statusRequestType = StatusRequestTypeBinaryState
} else if levelArgument := match["startingGroupAddressLabel"];
levelArgument != "" {
statusRequestType = StatusRequestTypeLevel
- startingGroupAddressLabelArgument :=
match["startingGroupAddressLabel"]
- decodedHex, _ :=
hex.DecodeString(startingGroupAddressLabelArgument)
+ decodedHex, _ := hex.DecodeString(levelArgument)
if len(decodedHex) != 1 {
panic("invalid state. Should have exactly 1")
}
@@ -192,7 +191,6 @@ func (m TagHandler) handleCalPattern(match
map[string]string) (apiModel.PlcTag,
}
recalParamNo = readWriteModel.Parameter(decodedHex[0])
} else {
-
if atoi, err :=
strconv.ParseUint(recallParamNoArgument, 10, 8); err == nil {
recalParamNo = readWriteModel.Parameter(atoi)
} else {
@@ -290,7 +288,7 @@ func (m TagHandler) handleSALPattern(match
map[string]string) (apiModel.PlcTag,
}
salCommand := match["salCommand"]
if salCommand == "" {
- return nil, errors.Wrap(err, "Error getting salCommand from
argument")
+ return nil, errors.New("Error getting salCommand from argument")
}
isValid := false
numElements := uint16(0)
diff --git a/plc4go/internal/cbus/TagHandler_test.go
b/plc4go/internal/cbus/TagHandler_test.go
index fd3690c33c..36c2f0efb7 100644
--- a/plc4go/internal/cbus/TagHandler_test.go
+++ b/plc4go/internal/cbus/TagHandler_test.go
@@ -23,7 +23,6 @@ import (
apiModel "github.com/apache/plc4x/plc4go/pkg/api/model"
readWriteModel
"github.com/apache/plc4x/plc4go/protocols/cbus/readwrite/model"
"github.com/stretchr/testify/assert"
- "reflect"
"regexp"
"testing"
)
@@ -233,7 +232,7 @@ func TestTagHandler_ParseTag(t *testing.T) {
t.Errorf("ParseTag() error = %v, wantErr %v",
err, tt.wantErr)
return
}
- assert.Equal(t, got, tt.want)
+ assert.Equal(t, tt.want, got)
})
}
}
@@ -294,7 +293,7 @@ func TestTagHandler_ParseQuery(t *testing.T) {
t.Errorf("ParseQuery() error = %v, wantErr %v",
err, tt.wantErr)
return
}
- if !assert.Equal(t, got, tt.want) {
+ if !assert.Equal(t, tt.want, got) {
t.Errorf("ParseQuery() got = %v, want %v", got,
tt.want)
}
})
@@ -470,7 +469,157 @@ func TestTagHandler_handleCalPattern(t *testing.T) {
want apiModel.PlcTag
wantErr assert.ErrorAssertionFunc
}{
- // TODO: Add test cases.
+ {
+ name: "empty",
+ wantErr: assert.Error,
+ },
+ {
+ name: "invalid cal type",
+ args: args{match: map[string]string{
+ "unitAddress": "0",
+ "calType": "invalid",
+ }},
+ wantErr: assert.Error,
+ },
+ // TODO: implement reset=
+ {
+ name: "recall unknown param",
+ args: args{match: map[string]string{
+ "unitAddress": "0",
+ "calType": "recall=",
+ }},
+ wantErr: assert.Error,
+ },
+ {
+ name: "recall invalid recall count",
+ args: args{match: map[string]string{
+ "unitAddress": "0",
+ "calType": "recall=",
+ "recallParamNo": "1",
+ }},
+ wantErr: assert.Error,
+ },
+ {
+ name: "recall",
+ args: args{match: map[string]string{
+ "unitAddress": "0",
+ "calType": "recall=",
+ "recallParamNo": "1",
+ "recallCount": "2",
+ }},
+ want: &calRecallTag{
+ calTag: calTag{
+ unitAddress:
readWriteModel.NewUnitAddress(0),
+ },
+ tagType: CAL_RECALL,
+ parameter: 1,
+ count: 2,
+ numElements: 1,
+ },
+ wantErr: assert.NoError,
+ },
+ {
+ name: "identify unknown param",
+ args: args{match: map[string]string{
+ "unitAddress": "0",
+ "calType": "identify=",
+ }},
+ wantErr: assert.Error,
+ },
+ {
+ name: "identify with number",
+ args: args{match: map[string]string{
+ "unitAddress": "0",
+ "calType": "identify=",
+ "identifyAttribute": "1",
+ }},
+ want: &calIdentifyTag{
+ calTag: calTag{
+ unitAddress:
readWriteModel.NewUnitAddress(0),
+ },
+ tagType: CAL_IDENTIFY,
+ attribute: readWriteModel.Attribute_Type,
+ numElements: 1,
+ },
+ wantErr: assert.NoError,
+ },
+ {
+ name: "identify with name",
+ args: args{match: map[string]string{
+ "unitAddress": "0",
+ "calType": "identify=",
+ "identifyAttribute": "Type",
+ }},
+ want: &calIdentifyTag{
+ calTag: calTag{
+ unitAddress:
readWriteModel.NewUnitAddress(0),
+ },
+ tagType: CAL_IDENTIFY,
+ attribute: readWriteModel.Attribute_Type,
+ numElements: 1,
+ },
+ wantErr: assert.NoError,
+ },
+ {
+ name: "getStatus unknown param",
+ args: args{match: map[string]string{
+ "unitAddress": "0",
+ "calType": "getStatus=",
+ }},
+ wantErr: assert.Error,
+ },
+ {
+ name: "getStatus invalid recall count",
+ args: args{match: map[string]string{
+ "unitAddress": "0",
+ "calType": "getStatus=",
+ "getStatusParamNo": "1",
+ }},
+ wantErr: assert.Error,
+ },
+ {
+ name: "getStatus by number",
+ args: args{match: map[string]string{
+ "unitAddress": "0",
+ "calType": "getStatus=",
+ "getStatusParamNo": "1",
+ "getStatusCount": "2",
+ }},
+ want: &calGetStatusTag{
+ calTag: calTag{
+ unitAddress:
readWriteModel.NewUnitAddress(0),
+ },
+ tagType: CAL_GETSTATUS,
+ parameter:
readWriteModel.Parameter_UNKNOWN_02,
+ count: 2,
+ numElements: 1,
+ },
+ wantErr: assert.NoError,
+ },
+ {
+ name: "getStatus by name",
+ args: args{match: map[string]string{
+ "unitAddress": "0",
+ "calType": "getStatus=",
+ "getStatusParamNo": "INTERFACE_OPTIONS_1",
+ "getStatusCount": "2",
+ }},
+ want: &calGetStatusTag{
+ calTag: calTag{
+ unitAddress:
readWriteModel.NewUnitAddress(0),
+ },
+ tagType: CAL_GETSTATUS,
+ parameter:
readWriteModel.Parameter_INTERFACE_OPTIONS_1,
+ count: 2,
+ numElements: 1,
+ },
+ wantErr: assert.NoError,
+ },
+ // TODO: implement write=
+ // TODO: implement identifyReply=
+ // TODO: implement reply=
+ // TODO: implement status=
+ // TODO: implement statusExtended=
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
@@ -510,7 +659,44 @@ func TestTagHandler_handleMMIMonitorPattern(t *testing.T) {
want apiModel.PlcTag
wantErr assert.ErrorAssertionFunc
}{
- // TODO: Add test cases.
+ {
+ name: "error",
+ args: args{match: map[string]string{
+ "unitAddress": "blub",
+ "application": "blub",
+ }},
+ wantErr: assert.Error,
+ },
+ {
+ name: "wildcards",
+ args: args{match: map[string]string{
+ "unitAddress": "*",
+ "application": "*",
+ }},
+ want: &mmiMonitorTag{
+ tagType: MMI_STATUS_MONITOR,
+ numElements: 1,
+ },
+ wantErr: assert.NoError,
+ },
+ {
+ name: "fixed",
+ args: args{match: map[string]string{
+ "unitAddress": "2",
+ "application": "LIGHTING",
+ }},
+ want: &mmiMonitorTag{
+ tagType: MMI_STATUS_MONITOR,
+ unitAddress: readWriteModel.NewUnitAddress(2),
+ application: func()
*readWriteModel.ApplicationIdContainer {
+ var applicationId
readWriteModel.ApplicationIdContainer
+ applicationId =
readWriteModel.ApplicationIdContainer_LIGHTING_38
+ return &applicationId
+ }(),
+ numElements: 1,
+ },
+ wantErr: assert.NoError,
+ },
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
@@ -532,42 +718,82 @@ func TestTagHandler_handleMMIMonitorPattern(t *testing.T)
{
}
func TestTagHandler_handleStatusRequestPattern(t *testing.T) {
- type fields struct {
- statusRequestPattern *regexp.Regexp
- calPattern *regexp.Regexp
- salPattern *regexp.Regexp
- salMonitorPattern *regexp.Regexp
- mmiMonitorPattern *regexp.Regexp
- unityQuery *regexp.Regexp
- }
type args struct {
match map[string]string
}
tests := []struct {
name string
- fields fields
args args
want apiModel.PlcTag
wantErr bool
}{
- // TODO: Add test cases.
+ {
+ name: "empty",
+ wantErr: true,
+ },
+ {
+ name: "statusRequestType empty",
+ args: args{match: map[string]string{
+ "statusRequestType": "",
+ }},
+ wantErr: true,
+ },
+ {
+ name: "statusRequestType minimal",
+ args: args{match: map[string]string{
+ "statusRequestType": "",
+ "application": "2",
+ }},
+ want: &statusTag{
+ tagType: STATUS,
+ statusRequestType: StatusRequestTypeBinaryState,
+ application:
readWriteModel.ApplicationIdContainer_FREE_USAGE_02,
+ numElements: 1,
+ },
+ },
+ {
+ name: "statusRequestType binary",
+ args: args{match: map[string]string{
+ "statusRequestType": "doesn't matter",
+ "binary": "doesn't matter",
+ "application": "2",
+ }},
+ want: &statusTag{
+ tagType: STATUS,
+ statusRequestType: StatusRequestTypeBinaryState,
+ application:
readWriteModel.ApplicationIdContainer_FREE_USAGE_02,
+ numElements: 1,
+ },
+ },
+ {
+ name: "statusRequestType level",
+ args: args{match: map[string]string{
+ "statusRequestType": "doesn't matter",
+ "startingGroupAddressLabel": "20",
+ "application": "2",
+ }},
+ want: &statusTag{
+ tagType: STATUS,
+ statusRequestType: StatusRequestTypeLevel,
+ startingGroupAddressLabel: func() *byte {
+ var level byte
+ level = 0x20
+ return &level
+ }(),
+ application:
readWriteModel.ApplicationIdContainer_FREE_USAGE_02,
+ numElements: 1,
+ },
+ },
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
- m := TagHandler{
- statusRequestPattern:
tt.fields.statusRequestPattern,
- calPattern: tt.fields.calPattern,
- salPattern: tt.fields.salPattern,
- salMonitorPattern:
tt.fields.salMonitorPattern,
- mmiMonitorPattern:
tt.fields.mmiMonitorPattern,
- unityQuery: tt.fields.unityQuery,
- }
+ m := NewTagHandler()
got, err := m.handleStatusRequestPattern(tt.args.match)
if (err != nil) != tt.wantErr {
t.Errorf("handleStatusRequestPattern() error =
%v, wantErr %v", err, tt.wantErr)
return
}
- if !reflect.DeepEqual(got, tt.want) {
+ if !assert.Equal(t, tt.want, got) {
t.Errorf("handleStatusRequestPattern() got =
%v, want %v", got, tt.want)
}
})
@@ -593,7 +819,42 @@ func TestTagHandler_handleSALMonitorPattern(t *testing.T) {
want apiModel.PlcTag
wantErr bool
}{
- // TODO: Add test cases.
+ {
+ name: "error",
+ args: args{match: map[string]string{
+ "unitAddress": "blub",
+ "application": "blub",
+ }},
+ wantErr: true,
+ },
+ {
+ name: "wildcards",
+ args: args{match: map[string]string{
+ "unitAddress": "*",
+ "application": "*",
+ }},
+ want: &salMonitorTag{
+ tagType: SAL_MONITOR,
+ numElements: 1,
+ },
+ },
+ {
+ name: "fixed",
+ args: args{match: map[string]string{
+ "unitAddress": "2",
+ "application": "LIGHTING",
+ }},
+ want: &salMonitorTag{
+ tagType: SAL_MONITOR,
+ unitAddress: readWriteModel.NewUnitAddress(2),
+ application: func()
*readWriteModel.ApplicationIdContainer {
+ var applicationId
readWriteModel.ApplicationIdContainer
+ applicationId =
readWriteModel.ApplicationIdContainer_LIGHTING_38
+ return &applicationId
+ }(),
+ numElements: 1,
+ },
+ },
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
@@ -610,7 +871,7 @@ func TestTagHandler_handleSALMonitorPattern(t *testing.T) {
t.Errorf("handleSALMonitorPattern() error = %v,
wantErr %v", err, tt.wantErr)
return
}
- if !reflect.DeepEqual(got, tt.want) {
+ if !assert.Equal(t, tt.want, got) {
t.Errorf("handleSALMonitorPattern() got = %v,
want %v", got, tt.want)
}
})
@@ -618,42 +879,287 @@ func TestTagHandler_handleSALMonitorPattern(t
*testing.T) {
}
func TestTagHandler_handleSALPattern(t *testing.T) {
- type fields struct {
- statusRequestPattern *regexp.Regexp
- calPattern *regexp.Regexp
- salPattern *regexp.Regexp
- salMonitorPattern *regexp.Regexp
- mmiMonitorPattern *regexp.Regexp
- unityQuery *regexp.Regexp
- }
type args struct {
match map[string]string
}
tests := []struct {
name string
- fields fields
args args
want apiModel.PlcTag
wantErr bool
}{
- // TODO: Add test cases.
+ {
+ name: "empty",
+ wantErr: true,
+ },
+ {
+ name: "empty sal command",
+ args: args{match: map[string]string{
+ "application": "LIGHTING",
+ }},
+ wantErr: true,
+ },
+ // TODO: implement ApplicationId_RESERVED
+ // TODO: implement ApplicationId_FREE_USAGE
+ {
+ name: "TEMPERATURE_BROADCAST BROADCAST_EVENT",
+ args: args{match: map[string]string{
+ "application": "TEMPERATURE_BROADCAST",
+ "salCommand": "BROADCAST_EVENT",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_TEMPERATURE_BROADCAST_19,
+ salCommand: "BROADCAST_EVENT",
+ numElements: 2,
+ },
+ },
+ // TODO: implement ApplicationId_ROOM_CONTROL_SYSTEM
+ {
+ name: "LIGHTING",
+ args: args{match: map[string]string{
+ "application": "LIGHTING",
+ "salCommand": "TERMINATE_RAMP",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_LIGHTING_38,
+ salCommand: "TERMINATE_RAMP",
+ numElements: 1,
+ },
+ },
+ {
+ name: "VENTILATION",
+ args: args{match: map[string]string{
+ "application": "VENTILATION",
+ "salCommand": "TERMINATE_RAMP",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_VENTILATION_70,
+ salCommand: "TERMINATE_RAMP",
+ numElements: 1,
+ },
+ },
+ {
+ name: "IRRIGATION_CONTROL",
+ args: args{match: map[string]string{
+ "application": "IRRIGATION_CONTROL",
+ "salCommand": "TERMINATE_RAMP",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_IRRIGATION_CONTROL_71,
+ salCommand: "TERMINATE_RAMP",
+ numElements: 1,
+ },
+ },
+ {
+ name: "POOLS_SPAS_PONDS_FOUNTAINS_CONTROL",
+ args: args{match: map[string]string{
+ "application":
"POOLS_SPAS_PONDS_FOUNTAINS_CONTROL",
+ "salCommand": "TERMINATE_RAMP",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_POOLS_SPAS_PONDS_FOUNTAINS_CONTROL_72,
+ salCommand: "TERMINATE_RAMP",
+ numElements: 1,
+ },
+ },
+ {
+ name: "HEATING",
+ args: args{match: map[string]string{
+ "application": "HEATING",
+ "salCommand": "TERMINATE_RAMP",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_HEATING_88,
+ salCommand: "TERMINATE_RAMP",
+ numElements: 1,
+ },
+ },
+ {
+ name: "AIR_CONDITIONING",
+ args: args{match: map[string]string{
+ "application": "AIR_CONDITIONING",
+ "salCommand": "ZONE_HUMIDITY_PLANT_STATUS",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_AIR_CONDITIONING_AC,
+ salCommand: "ZONE_HUMIDITY_PLANT_STATUS",
+ numElements: 5,
+ },
+ },
+ {
+ name: "TRIGGER_CONTROL",
+ args: args{match: map[string]string{
+ "application": "TRIGGER_CONTROL",
+ "salCommand": "TRIGGER_MAX",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_TRIGGER_CONTROL_CA,
+ salCommand: "TRIGGER_MAX",
+ numElements: 0,
+ },
+ },
+ {
+ name: "ENABLE_CONTROL",
+ args: args{match: map[string]string{
+ "application": "ENABLE_CONTROL",
+ "salCommand": "SET_NETWORK_VARIABLE",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_ENABLE_CONTROL_CB,
+ salCommand: "SET_NETWORK_VARIABLE",
+ numElements: 1,
+ },
+ },
+ {
+ name: "AUDIO_AND_VIDEO",
+ args: args{match: map[string]string{
+ "application": "AUDIO_AND_VIDEO",
+ "salCommand": "RAMP_TO_LEVEL",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_AUDIO_AND_VIDEO_CD,
+ salCommand: "RAMP_TO_LEVEL",
+ numElements: 2,
+ },
+ },
+ {
+ name: "SECURITY",
+ args: args{match: map[string]string{
+ "application": "SECURITY",
+ "salCommand": "EVENT",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_SECURITY_D0,
+ salCommand: "EVENT",
+ numElements: 255,
+ },
+ },
+ {
+ name: "METERING",
+ args: args{match: map[string]string{
+ "application": "METERING",
+ "salCommand": "EVENT",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_METERING_D1,
+ salCommand: "EVENT",
+ numElements: 255,
+ },
+ },
+ {
+ name: "ACCESS_CONTROL",
+ args: args{match: map[string]string{
+ "application": "ACCESS_CONTROL",
+ "salCommand": "ACCESS_POINT_FORCED_OPEN",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_ACCESS_CONTROL_D5,
+ salCommand: "ACCESS_POINT_FORCED_OPEN",
+ numElements: 0,
+ },
+ },
+ {
+ name: "CLOCK_AND_TIMEKEEPING",
+ args: args{match: map[string]string{
+ "application": "CLOCK_AND_TIMEKEEPING",
+ "salCommand": "REQUEST_REFRESH",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_CLOCK_AND_TIMEKEEPING_DF,
+ salCommand: "REQUEST_REFRESH",
+ numElements: 0,
+ },
+ },
+ {
+ name: "TELEPHONY_STATUS_AND_CONTROL",
+ args: args{match: map[string]string{
+ "application": "TELEPHONY_STATUS_AND_CONTROL",
+ "salCommand": "EVENT",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_TELEPHONY_STATUS_AND_CONTROL_E0,
+ salCommand: "EVENT",
+ numElements: 255,
+ },
+ },
+ {
+ name: "MEASUREMENT",
+ args: args{match: map[string]string{
+ "application": "MEASUREMENT",
+ "salCommand": "MEASUREMENT_EVENT",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_MEASUREMENT_E4,
+ salCommand: "MEASUREMENT_EVENT",
+ numElements: 6,
+ },
+ },
+ // TODO: implement ApplicationId_TESTING
+ {
+ name: "MEDIA_TRANSPORT_CONTROL",
+ args: args{match: map[string]string{
+ "application": "MEDIA_TRANSPORT_CONTROL",
+ "salCommand": "NEXT_PREVIOUS_SELECTION",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_MEDIA_TRANSPORT_CONTROL_C0,
+ salCommand: "NEXT_PREVIOUS_SELECTION",
+ numElements: 1,
+ },
+ },
+ {
+ name: "ERROR_REPORTING",
+ args: args{match: map[string]string{
+ "application": "ERROR_REPORTING",
+ "salCommand": "CLEAR_MOST_SEVERE",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_ERROR_REPORTING_CE,
+ salCommand: "CLEAR_MOST_SEVERE",
+ numElements: 8,
+ },
+ },
+ {
+ name: "HVAC_ACTUATOR",
+ args: args{match: map[string]string{
+ "application": "HVAC_ACTUATOR",
+ "salCommand": "TERMINATE_RAMP",
+ }},
+ want: &salTag{
+ tagType: SAL,
+ application:
readWriteModel.ApplicationIdContainer_HVAC_ACTUATOR_73,
+ salCommand: "TERMINATE_RAMP",
+ numElements: 1,
+ },
+ },
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
- m := TagHandler{
- statusRequestPattern:
tt.fields.statusRequestPattern,
- calPattern: tt.fields.calPattern,
- salPattern: tt.fields.salPattern,
- salMonitorPattern:
tt.fields.salMonitorPattern,
- mmiMonitorPattern:
tt.fields.mmiMonitorPattern,
- unityQuery: tt.fields.unityQuery,
- }
+ m := NewTagHandler()
got, err := m.handleSALPattern(tt.args.match)
if (err != nil) != tt.wantErr {
t.Errorf("handleSALPattern() error = %v,
wantErr %v", err, tt.wantErr)
return
}
- if !reflect.DeepEqual(got, tt.want) {
+ if !assert.Equal(t, tt.want, got) {
t.Errorf("handleSALPattern() got = %v, want
%v", got, tt.want)
}
})
@@ -679,7 +1185,47 @@ func TestTagHandler_handleUnitQuery(t *testing.T) {
want apiModel.PlcQuery
wantErr bool
}{
- // TODO: Add test cases.
+ {
+ name: "empty",
+ wantErr: true,
+ },
+ {
+ name: "only unit address",
+ args: args{match: map[string]string{
+ "unitAddress": "2",
+ }},
+ wantErr: true,
+ },
+ {
+ name: "identify all",
+ args: args{match: map[string]string{
+ "unitAddress": "2",
+ "identifyAttribute": "*",
+ }},
+ want: &unitInfoQuery{
+ tagType: UNIT_INFO,
+ unitAddress: readWriteModel.NewUnitAddress(2),
+ attribute: nil,
+ numElements: 1,
+ },
+ },
+ {
+ name: "identify type",
+ args: args{match: map[string]string{
+ "unitAddress": "2",
+ "identifyAttribute": "Type",
+ }},
+ want: &unitInfoQuery{
+ tagType: UNIT_INFO,
+ unitAddress: readWriteModel.NewUnitAddress(2),
+ attribute: func() *readWriteModel.Attribute {
+ var attributeType
readWriteModel.Attribute
+ attributeType =
readWriteModel.Attribute_Type
+ return &attributeType
+ }(),
+ numElements: 1,
+ },
+ },
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
@@ -696,7 +1242,7 @@ func TestTagHandler_handleUnitQuery(t *testing.T) {
t.Errorf("handleUnitQuery() error = %v, wantErr
%v", err, tt.wantErr)
return
}
- if !reflect.DeepEqual(got, tt.want) {
+ if !assert.Equal(t, tt.want, got) {
t.Errorf("handleUnitQuery() got = %v, want %v",
got, tt.want)
}
})
@@ -709,7 +1255,10 @@ func TestTagType_GetName(t *testing.T) {
i TagType
want string
}{
- // TODO: Add test cases.
+ {
+ name: "empty",
+ want: "STATUS",
+ },
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
@@ -721,37 +1270,50 @@ func TestTagType_GetName(t *testing.T) {
}
func TestTagHandler_unitAddressFromArgument(t *testing.T) {
- type fields struct {
- statusRequestPattern *regexp.Regexp
- calPattern *regexp.Regexp
- salPattern *regexp.Regexp
- salMonitorPattern *regexp.Regexp
- mmiMonitorPattern *regexp.Regexp
- unityQuery *regexp.Regexp
- }
type args struct {
unitAddressArgument string
allowWildcard bool
}
tests := []struct {
name string
- fields fields
args args
want readWriteModel.UnitAddress
wantErr assert.ErrorAssertionFunc
}{
- // TODO: Add test cases.
+ {
+ name: "empty",
+ wantErr: assert.Error,
+ },
+ {
+ name: "wrong address",
+ args: args{
+ unitAddressArgument: "adsfadsf",
+ allowWildcard: false,
+ },
+ wantErr: assert.Error,
+ },
+ {
+ name: "address decimal",
+ args: args{
+ unitAddressArgument: "1",
+ allowWildcard: false,
+ },
+ want: readWriteModel.NewUnitAddress(1),
+ wantErr: assert.NoError,
+ },
+ {
+ name: "address hex",
+ args: args{
+ unitAddressArgument: "0x01",
+ allowWildcard: false,
+ },
+ want: readWriteModel.NewUnitAddress(1),
+ wantErr: assert.NoError,
+ },
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
- m := TagHandler{
- statusRequestPattern:
tt.fields.statusRequestPattern,
- calPattern: tt.fields.calPattern,
- salPattern: tt.fields.salPattern,
- salMonitorPattern:
tt.fields.salMonitorPattern,
- mmiMonitorPattern:
tt.fields.mmiMonitorPattern,
- unityQuery: tt.fields.unityQuery,
- }
+ m := NewTagHandler()
got, err :=
m.unitAddressFromArgument(tt.args.unitAddressArgument, tt.args.allowWildcard)
if !tt.wantErr(t, err,
fmt.Sprintf("unitAddressFromArgument(%v, %v)", tt.args.unitAddressArgument,
tt.args.allowWildcard)) {
return
@@ -760,21 +1322,3 @@ func TestTagHandler_unitAddressFromArgument(t *testing.T)
{
})
}
}
-
-func Test_c2nl1(t *testing.T) {
- type args struct {
- t []CommandAndArgumentsCount
- }
- tests := []struct {
- name string
- args args
- want []CommandAndArgumentsCount
- }{
- // TODO: Add test cases.
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- assert.Equalf(t, tt.want, c2nl(tt.args.t), "c2nl(%v)",
tt.args.t)
- })
- }
-}