package kneron import ( "testing" ) // TestParseScanDevices_WithKnNumber verifies the serial number (kn_number) // reported by the Python bridge is preserved into DeviceInfo.SerialNumber // while the synthetic local ID stays untouched (ADR-018 serial routing, WP-0). func TestParseScanDevices_WithKnNumber(t *testing.T) { raw := []interface{}{ map[string]interface{}{ "port": "1-2", "firmware": "KDP", "kn_number": "0x1A2B3C4D", "product_id": "0x0100", }, map[string]interface{}{ "port": "1-3", "firmware": "KDP2", "kn_number": "0x0E5F6071", "product_id": "0x0720", }, } devices := parseScanDevices(raw) if len(devices) != 2 { t.Fatalf("parseScanDevices() = %d devices, want 2", len(devices)) } if devices[0].ID != "kl520-0" { t.Errorf("devices[0].ID = %q, want kl520-0 (synthetic ID must not change)", devices[0].ID) } if devices[0].SerialNumber != "0x1A2B3C4D" { t.Errorf("devices[0].SerialNumber = %q, want 0x1A2B3C4D", devices[0].SerialNumber) } if devices[1].ID != "kl720-0" { t.Errorf("devices[1].ID = %q, want kl720-0", devices[1].ID) } if devices[1].SerialNumber != "0x0E5F6071" { t.Errorf("devices[1].SerialNumber = %q, want 0x0E5F6071", devices[1].SerialNumber) } } // TestParseScanDevices_MissingKnNumber verifies a payload without kn_number // still yields the full device list (serial empty, no panic, no device drop). func TestParseScanDevices_MissingKnNumber(t *testing.T) { raw := []interface{}{ map[string]interface{}{ "port": "1-2", "firmware": "KDP", "product_id": "0x0100", }, } devices := parseScanDevices(raw) if len(devices) != 1 { t.Fatalf("parseScanDevices() = %d devices, want 1 (device must not be dropped)", len(devices)) } if devices[0].SerialNumber != "" { t.Errorf("SerialNumber = %q, want empty when kn_number absent", devices[0].SerialNumber) } if devices[0].ID != "kl520-0" { t.Errorf("ID = %q, want kl520-0", devices[0].ID) } } // TestParseScanDevices_NonStringKnNumber verifies a non-string kn_number // (e.g. raw number instead of formatted hex string) does not panic and the // device is still registered with an empty serial. func TestParseScanDevices_NonStringKnNumber(t *testing.T) { raw := []interface{}{ map[string]interface{}{ "port": "1-2", "kn_number": float64(123456), // JSON number decodes to float64 "product_id": "0x0200", }, } devices := parseScanDevices(raw) if len(devices) != 1 { t.Fatalf("parseScanDevices() = %d devices, want 1", len(devices)) } if devices[0].SerialNumber != "" { t.Errorf("SerialNumber = %q, want empty for non-string kn_number", devices[0].SerialNumber) } } // TestParseScanDevices_WhitespaceTrimmed verifies kn_number whitespace is trimmed. func TestParseScanDevices_WhitespaceTrimmed(t *testing.T) { raw := []interface{}{ map[string]interface{}{ "kn_number": " 0x1A2B3C4D ", "product_id": "0x0100", }, } devices := parseScanDevices(raw) if len(devices) != 1 { t.Fatalf("parseScanDevices() = %d devices, want 1", len(devices)) } if devices[0].SerialNumber != "0x1A2B3C4D" { t.Errorf("SerialNumber = %q, want trimmed 0x1A2B3C4D", devices[0].SerialNumber) } }