package model import ( "testing" "modelRT/orm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestBuildMeasurementDataObjectHashesCreatesCanonicalHashAndAllAliases(t *testing.T) { record := measurementInitializationRecordForTest() hashes, err := buildMeasurementDataObjectHashes([]MeasurementInitializationRecord{record}) require.NoError(t, err) require.Len(t, hashes, 1) 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, []string{fullToken, fourPartToken, twoPartToken}, hashes[0].Aliases) 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"]) } 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") } 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") } 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), }, }, } }