2026-07-29 15:12:05 +08:00
|
|
|
package model
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"modelRT/orm"
|
|
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestBuildMeasurementDataObjectHashesCreatesAllTokenForms(t *testing.T) {
|
|
|
|
|
record := measurementInitializationRecordForTest()
|
|
|
|
|
|
|
|
|
|
hashes, err := buildMeasurementDataObjectHashes([]MeasurementInitializationRecord{record})
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
require.Len(t, hashes, 3)
|
|
|
|
|
|
|
|
|
|
fullToken := "grid000.zone000.station000.220kV_xuefulu1.CTA.bay.IA_rms"
|
|
|
|
|
fourPartToken := "220kV_xuefulu1.CTA.bay.IA_rms"
|
|
|
|
|
twoPartToken := "220kV_xuefulu1.IA_rms"
|
|
|
|
|
assert.Equal(t, fullToken, hashes[0].Key)
|
|
|
|
|
assert.Equal(t, fourPartToken, hashes[1].Key)
|
|
|
|
|
assert.Equal(t, twoPartToken, hashes[2].Key)
|
|
|
|
|
|
|
|
|
|
fields := hashes[0].Fields
|
|
|
|
|
assert.NotContains(t, fields, "value")
|
|
|
|
|
assert.Equal(t, int16(1), fields["mode"])
|
|
|
|
|
assert.Equal(t, "MEASUREMENT", fields["meta"])
|
|
|
|
|
assert.Equal(t, "TM", fields["type"])
|
|
|
|
|
assert.Equal(t, twoPartToken, fields["name"])
|
|
|
|
|
assert.Equal(t, "A相保护电流有效值", fields["description"])
|
|
|
|
|
assert.Equal(t, fullToken, fields["id"])
|
|
|
|
|
assert.Equal(t, 1, fields["size"])
|
|
|
|
|
assert.Equal(t, `{"io_address":{"channel":"TM1","device":"CTA","dtype":1,"option":"rms","station":"001"},"type":1}`, fields["data_source"])
|
|
|
|
|
assert.Equal(t, `{}`, fields["event_plan"])
|
|
|
|
|
assert.Equal(t, `{"ct":{"index":0,"polarity":1,"ratio":1250}}`, fields["binding"])
|
|
|
|
|
assert.Equal(t, fields, hashes[1].Fields)
|
|
|
|
|
assert.Equal(t, fields, hashes[2].Fields)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestBuildMeasurementDataObjectHashesRejectsAmbiguousShortToken(t *testing.T) {
|
|
|
|
|
first := measurementInitializationRecordForTest()
|
|
|
|
|
second := first
|
|
|
|
|
second.GridTag = "grid001"
|
|
|
|
|
second.ZoneTag = "zone001"
|
|
|
|
|
second.StationTag = "station001"
|
|
|
|
|
second.ComponentUUID = "component-uuid-2"
|
|
|
|
|
second.ComponentTag = "CTB"
|
|
|
|
|
second.MeasurementID = 2
|
|
|
|
|
|
|
|
|
|
_, err := buildMeasurementDataObjectHashes([]MeasurementInitializationRecord{first, second})
|
|
|
|
|
require.Error(t, err)
|
|
|
|
|
assert.Contains(t, err.Error(), "ambiguous measurement token")
|
|
|
|
|
assert.Contains(t, err.Error(), "220kV_xuefulu1.IA_rms")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestBuildMeasurementDataObjectHashesRejectsUnsupportedMeasurementType(t *testing.T) {
|
|
|
|
|
record := measurementInitializationRecordForTest()
|
|
|
|
|
record.MeasurementType = 5
|
|
|
|
|
|
|
|
|
|
_, err := buildMeasurementDataObjectHashes([]MeasurementInitializationRecord{record})
|
|
|
|
|
require.Error(t, err)
|
|
|
|
|
assert.Contains(t, err.Error(), "derive type")
|
|
|
|
|
assert.Contains(t, err.Error(), "unsupported measurement type 5")
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-30 15:32:22 +08:00
|
|
|
func TestBuildMeasurementDataObjectHashesRejectsInvalidWindowSize(t *testing.T) {
|
|
|
|
|
record := measurementInitializationRecordForTest()
|
|
|
|
|
record.MeasurementSize = 0
|
|
|
|
|
|
|
|
|
|
_, err := buildMeasurementDataObjectHashes([]MeasurementInitializationRecord{record})
|
|
|
|
|
require.Error(t, err)
|
|
|
|
|
assert.Contains(t, err.Error(), "window size must be greater than 0")
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-29 15:12:05 +08:00
|
|
|
func measurementInitializationRecordForTest() MeasurementInitializationRecord {
|
|
|
|
|
return MeasurementInitializationRecord{
|
|
|
|
|
GridTag: "grid000",
|
|
|
|
|
ZoneTag: "zone000",
|
|
|
|
|
StationTag: "station000",
|
|
|
|
|
ComponentUUID: "component-uuid-1",
|
|
|
|
|
ComponentNSPath: "220kV_xuefulu1",
|
|
|
|
|
ComponentTag: "CTA",
|
|
|
|
|
MeasurementID: 1,
|
|
|
|
|
MeasurementTag: "IA_rms",
|
|
|
|
|
MeasurementName: "A相保护电流有效值",
|
|
|
|
|
MeasurementType: 0,
|
|
|
|
|
MeasurementMode: 1,
|
|
|
|
|
MeasurementSize: 1,
|
|
|
|
|
MeasurementDataSource: orm.JSONMap{
|
|
|
|
|
"type": float64(1),
|
|
|
|
|
"io_address": map[string]any{
|
|
|
|
|
"station": "001",
|
|
|
|
|
"device": "CTA",
|
|
|
|
|
"channel": "TM1",
|
|
|
|
|
"dtype": float64(1),
|
|
|
|
|
"option": "rms",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
MeasurementEventPlan: orm.JSONMap{},
|
|
|
|
|
MeasurementBinding: orm.JSONMap{
|
|
|
|
|
"ct": map[string]any{
|
|
|
|
|
"index": float64(0),
|
|
|
|
|
"ratio": float64(1250),
|
|
|
|
|
"polarity": float64(1),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|