1+ import os
2+ import tempfile
3+ import pandas as pd
14from Granny .Models .Values .MetaDataValue import MetaDataValue
5+ from Granny .Models .Values .FloatValue import FloatValue
6+ from Granny .Models .Values .StringValue import StringValue
7+ from Granny .Models .Images .RGBImage import RGBImage
8+ import numpy as np
29
310
11+ def _make_image (name , rating_val , project = None , lot = None , date = None , variety = None ):
12+ """Helper to create a test image with metadata."""
13+ img = RGBImage (name )
14+ img .setImage (np .zeros ((10 , 10 , 3 ), dtype = np .uint8 ))
415
5-
16+ rating = FloatValue ("rating" , "rating" , "test rating" )
17+ rating .setMin (0.0 )
18+ rating .setMax (1.0 )
19+ rating .setValue (rating_val )
20+ img .addValue (rating )
21+
22+ if project :
23+ for key , val in [("project" , project ), ("lot" , lot ), ("date" , date ), ("variety" , variety )]:
24+ sv = StringValue (key , key , f"test { key } " )
25+ sv .setValue (val )
26+ img .addValue (sv )
27+
28+ return img
29+
30+
31+ def test_write_tray_summary_with_string_columns ():
32+ """tray_summary.csv should include string metadata columns like project, lot, date, variety."""
33+ with tempfile .TemporaryDirectory () as tmpdir :
34+ mdv = MetaDataValue ("results" , "results" , "test" )
35+ mdv .setValue (tmpdir )
36+
37+ images = [
38+ _make_image ("PROJ_LOT1_2025-01-01_VAR_fruit_01.png" , 0.8 , "PROJ" , "LOT1" , "2025-01-01" , "VAR" ),
39+ _make_image ("PROJ_LOT1_2025-01-01_VAR_fruit_02.png" , 0.6 , "PROJ" , "LOT1" , "2025-01-01" , "VAR" ),
40+ ]
41+ mdv .setImageList (images )
42+ mdv .writeValue ()
43+
44+ tray_df = pd .read_csv (os .path .join (tmpdir , "tray_summary.csv" ))
45+ assert "project" in tray_df .columns
46+ assert "lot" in tray_df .columns
47+ assert "date" in tray_df .columns
48+ assert "variety" in tray_df .columns
49+ assert tray_df ["project" ].iloc [0 ] == "PROJ"
50+ assert tray_df ["lot" ].iloc [0 ] == "LOT1"
51+ assert tray_df ["rating" ].iloc [0 ] == 0.7 # average of 0.8 and 0.6
52+
53+
54+ def test_write_tray_summary_without_string_columns ():
55+ """tray_summary.csv should still work without string metadata."""
56+ with tempfile .TemporaryDirectory () as tmpdir :
57+ mdv = MetaDataValue ("results" , "results" , "test" )
58+ mdv .setValue (tmpdir )
59+
60+ images = [
61+ _make_image ("apple_fruit_01.png" , 0.9 ),
62+ _make_image ("apple_fruit_02.png" , 0.7 ),
63+ ]
64+ mdv .setImageList (images )
65+ mdv .writeValue ()
66+
67+ tray_df = pd .read_csv (os .path .join (tmpdir , "tray_summary.csv" ))
68+ assert "TrayName" in tray_df .columns
69+ assert "rating" in tray_df .columns
70+ assert abs (tray_df ["rating" ].iloc [0 ] - 0.8 ) < 0.001
71+
72+
73+ def test_results_csv_has_all_rows ():
74+ """results.csv should have one row per image."""
75+ with tempfile .TemporaryDirectory () as tmpdir :
76+ mdv = MetaDataValue ("results" , "results" , "test" )
77+ mdv .setValue (tmpdir )
78+
79+ images = [
80+ _make_image ("PROJ_LOT1_2025-01-01_VAR_fruit_01.png" , 0.5 , "PROJ" , "LOT1" , "2025-01-01" , "VAR" ),
81+ _make_image ("PROJ_LOT1_2025-01-01_VAR_fruit_02.png" , 0.6 , "PROJ" , "LOT1" , "2025-01-01" , "VAR" ),
82+ _make_image ("PROJ_LOT1_2025-01-01_VAR_fruit_03.png" , 0.7 , "PROJ" , "LOT1" , "2025-01-01" , "VAR" ),
83+ ]
84+ mdv .setImageList (images )
85+ mdv .writeValue ()
86+
87+ results_df = pd .read_csv (os .path .join (tmpdir , "results.csv" ))
88+ assert len (results_df ) == 3
0 commit comments