@@ -1112,6 +1112,94 @@ def test_table_with_frozen_columns() -> None:
11121112 assert table ._component_args ["freeze-columns-right" ] == ["d" , "e" ]
11131113
11141114
1115+ @pytest .mark .skipif (
1116+ not DependencyManager .pandas .has (), reason = "Pandas not installed"
1117+ )
1118+ class TestFrozenRowHeaders :
1119+ def test_freeze_unnamed_pandas_index_rejected (self ) -> None :
1120+ import pandas as pd
1121+
1122+ df = pd .DataFrame ({"a" : [1 , 2 , 3 ]}, index = ["x" , "y" , "z" ])
1123+ with pytest .raises (ValueError , match = "unnamed row index" ):
1124+ ui .table (df , freeze_columns_left = ["" ])
1125+
1126+ def test_freeze_named_pandas_index (self ) -> None :
1127+ import pandas as pd
1128+
1129+ df = pd .DataFrame (
1130+ {"a" : [1 , 2 ]}, index = pd .Index (["x" , "y" ], name = "foo" )
1131+ )
1132+ table = ui .table (df , freeze_columns_left = ["foo" ])
1133+ assert table ._component_args ["freeze-columns-left" ] == ["foo" ]
1134+
1135+ def test_freeze_multiindex_levels (self ) -> None :
1136+ import pandas as pd
1137+
1138+ df = pd .DataFrame (
1139+ {"v" : [1 , 2 , 3 , 4 ]},
1140+ index = pd .MultiIndex .from_tuples (
1141+ [("a" , 1 ), ("a" , 2 ), ("b" , 1 ), ("b" , 2 )], names = ["g" , "n" ]
1142+ ),
1143+ )
1144+ table = ui .table (df , freeze_columns_left = ["g" , "n" ])
1145+ assert table ._component_args ["freeze-columns-left" ] == ["g" , "n" ]
1146+
1147+ def test_freeze_collision_suffixed_index (self ) -> None :
1148+ import pandas as pd
1149+
1150+ # Index name 'a' collides with a column named 'a'; the row-header
1151+ # name is suffixed to '_index' (see _resolve_index_name).
1152+ df = pd .DataFrame ({"a" : [1 , 2 ]}, index = pd .Index (["x" , "y" ], name = "a" ))
1153+ table = ui .table (df , freeze_columns_left = ["a_index" ])
1154+ assert table ._component_args ["freeze-columns-left" ] == ["a_index" ]
1155+
1156+ def test_freeze_index_and_column_mixed (self ) -> None :
1157+ import pandas as pd
1158+
1159+ df = pd .DataFrame (
1160+ {"a" : [1 , 2 ], "b" : [3 , 4 ]},
1161+ index = pd .Index (["x" , "y" ], name = "foo" ),
1162+ )
1163+ table = ui .table (
1164+ df ,
1165+ freeze_columns_left = ["foo" , "a" ],
1166+ freeze_columns_right = ["b" ],
1167+ )
1168+ assert table ._component_args ["freeze-columns-left" ] == ["foo" , "a" ]
1169+ assert table ._component_args ["freeze-columns-right" ] == ["b" ]
1170+
1171+ def test_freeze_row_header_on_right_raises (self ) -> None :
1172+ import pandas as pd
1173+
1174+ df = pd .DataFrame (
1175+ {"a" : [1 , 2 ]}, index = pd .Index (["x" , "y" ], name = "foo" )
1176+ )
1177+ with pytest .raises (
1178+ ValueError , match = "row headers always render on the left"
1179+ ):
1180+ ui .table (df , freeze_columns_right = ["foo" ])
1181+
1182+ def test_freeze_unknown_column_still_raises (self ) -> None :
1183+ import pandas as pd
1184+
1185+ df = pd .DataFrame (
1186+ {"a" : [1 , 2 ]}, index = pd .Index (["x" , "y" ], name = "foo" )
1187+ )
1188+ with pytest .raises (ValueError , match = "not found in table" ):
1189+ ui .table (df , freeze_columns_left = ["nonexistent" ])
1190+
1191+
1192+ @pytest .mark .skipif (
1193+ not DependencyManager .polars .has (), reason = "Polars not installed"
1194+ )
1195+ def test_freeze_columns_polars_regression () -> None :
1196+ import polars as pl
1197+
1198+ df = pl .DataFrame ({"a" : [1 , 2 , 3 ], "b" : [4 , 5 , 6 ]})
1199+ table = ui .table (df , freeze_columns_left = ["a" ])
1200+ assert table ._component_args ["freeze-columns-left" ] == ["a" ]
1201+
1202+
11151203@pytest .mark .parametrize (
11161204 "df" ,
11171205 create_dataframes ({"a" : [1 , 2 , 3 ], "b" : ["abc" , "def" , None ]}),
0 commit comments