package printer import ( "image" "image/color" "math" "os" "path/filepath" "strings" "testing" ) // Test 1: MockDriver.Print(validBitmap) saves a PNG to SaveDir and returns nil. func TestMockDriverPrintSavesPNG(t *testing.T) { dir := t.TempDir() m := NewMockDriver() m.SaveDir = dir // Create a small 8x4 1-bit bitmap (all black). rowBytes := int(math.Ceil(8.0 / 8.0)) bitmap := make([]byte, rowBytes*4) for i := range bitmap { bitmap[i] = 0xFF // all black } if err := m.Print(bitmap, 8, 4); err != nil { t.Fatalf("Print returned unexpected error: %v", err) } entries, err := os.ReadDir(dir) if err != nil { t.Fatalf("ReadDir: %v", err) } found := false for _, e := range entries { if strings.HasPrefix(e.Name(), "hwlab-label-") && strings.HasSuffix(e.Name(), ".png") { found = true break } } if !found { t.Fatal("expected hwlab-label-*.png to be created in temp dir") } } // Test 2: MockDriver.Print(nil) returns ErrEmptyBitmap without panicking. func TestMockDriverPrintNilBitmap(t *testing.T) { m := NewMockDriver() err := m.Print(nil, 0, 0) if err != ErrEmptyBitmap { t.Fatalf("expected ErrEmptyBitmap, got %v", err) } } // Test 3: MockDriver.Connect() returns nil; Disconnect() returns nil. func TestMockDriverConnectDisconnect(t *testing.T) { m := NewMockDriver() if err := m.Connect(); err != nil { t.Fatalf("Connect: %v", err) } if err := m.Disconnect(); err != nil { t.Fatalf("Disconnect: %v", err) } } // Test 4: ImageToRawBitmap returns byte slice of length ceil(width*height/8). func TestImageToRawBitmapLength(t *testing.T) { cases := []struct { w, h int }{ {8, 4}, {7, 3}, {16, 1}, {384, 120}, } for _, c := range cases { img := image.NewGray(image.Rect(0, 0, c.w, c.h)) // Fill with a pattern: top half black, bottom half white. for y := 0; y < c.h/2; y++ { for x := 0; x < c.w; x++ { img.SetGray(x, y, color.Gray{Y: 0}) } } bitmap, w, h := ImageToRawBitmap(img) if w != c.w || h != c.h { t.Errorf("expected dimensions %dx%d, got %dx%d", c.w, c.h, w, h) } rowBytes := int(math.Ceil(float64(c.w) / 8.0)) want := rowBytes * c.h if len(bitmap) != want { t.Errorf("w=%d h=%d: expected bitmap len %d, got %d", c.w, c.h, want, len(bitmap)) } } } // Test 5: PrtQutieDriver.Connect() returns ErrNoDevice (not a panic). func TestPrtQutieConnectReturnsErrNoDevice(t *testing.T) { d := NewPrtQutieDriver(9600) err := d.Connect() if err != ErrNoDevice { t.Fatalf("expected ErrNoDevice, got %v", err) } } // Helper: create a dummy file path in temp dir to verify SaveDir is honoured. func TestMockDriverSaveDirHonoured(t *testing.T) { dir := t.TempDir() m := NewMockDriver() m.SaveDir = dir bitmap := []byte{0xFF, 0xFF} // 2 bytes → 16 pixels wide, 1 row if err := m.Print(bitmap, 16, 1); err != nil { t.Fatalf("Print: %v", err) } matches, _ := filepath.Glob(filepath.Join(dir, "hwlab-label-*.png")) if len(matches) == 0 { t.Fatal("no PNG saved in SaveDir") } }