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)
-               })
-       }
-}

Reply via email to