@@ -2172,4 +2172,138 @@ export const lightTheme = createTheme(vars, {
21722172 assert_eq ! ( result. len( ) , 1 ) ;
21732173 assert_eq ! ( result[ 0 ] , ( "fontStyle" . to_string( ) , "null" . to_string( ) ) ) ;
21742174 }
2175+
2176+ #[ test]
2177+ fn test_collected_styles_to_code_with_classes_composition ( ) {
2178+ let mut collected = CollectedStyles :: default ( ) ;
2179+ // Add base style
2180+ collected. styles . insert (
2181+ "base" . to_string ( ) ,
2182+ StyleEntry {
2183+ json : r#"{"padding":"8px"}"# . to_string ( ) ,
2184+ exported : false ,
2185+ bases : Vec :: new ( ) ,
2186+ } ,
2187+ ) ;
2188+ // Add composed style with bases
2189+ collected. styles . insert (
2190+ "composed" . to_string ( ) ,
2191+ StyleEntry {
2192+ json : r#"{"color":"red"}"# . to_string ( ) ,
2193+ exported : true ,
2194+ bases : vec ! [ "base" . to_string( ) ] ,
2195+ } ,
2196+ ) ;
2197+
2198+ let class_map: std:: collections:: HashMap < String , String > = [
2199+ ( "base" . to_string ( ) , "a" . to_string ( ) ) ,
2200+ ( "composed" . to_string ( ) , "b" . to_string ( ) ) ,
2201+ ]
2202+ . into_iter ( )
2203+ . collect ( ) ;
2204+
2205+ let code =
2206+ super :: collected_styles_to_code_with_classes ( & collected, "@devup-ui/react" , & class_map) ;
2207+ assert ! ( code. contains( "import { css } from '@devup-ui/react'" ) ) ;
2208+ // The composed style should have both base and own styles merged
2209+ assert ! ( code. contains( "padding" ) ) ;
2210+ assert ! ( code. contains( "color" ) ) ;
2211+ }
2212+
2213+ #[ test]
2214+ fn test_collected_styles_to_code_with_theme_vars ( ) {
2215+ let mut collected = CollectedStyles :: default ( ) ;
2216+ // Theme with vars_name and vars_object_json
2217+ collected. themes . insert (
2218+ "themeClass" . to_string ( ) ,
2219+ super :: ThemeEntry {
2220+ class_name : "f0_theme" . to_string ( ) ,
2221+ css_vars : vec ! [ ( "--color-primary" . to_string( ) , "blue" . to_string( ) ) ] ,
2222+ exported : true ,
2223+ vars_name : Some ( "vars" . to_string ( ) ) ,
2224+ vars_object_json : Some (
2225+ r#"{"color":{"primary":"var(--color-primary)"}}"# . to_string ( ) ,
2226+ ) ,
2227+ } ,
2228+ ) ;
2229+
2230+ let code = super :: collected_styles_to_code ( & collected, "@devup-ui/react" ) ;
2231+ assert ! ( code. contains( "export const [themeClass, vars] = [\" f0_theme\" " ) ) ;
2232+ }
2233+
2234+ #[ test]
2235+ fn test_collected_styles_to_code_with_theme_no_vars ( ) {
2236+ let mut collected = CollectedStyles :: default ( ) ;
2237+ // Theme without vars (two-arg createTheme)
2238+ collected. themes . insert (
2239+ "darkTheme" . to_string ( ) ,
2240+ super :: ThemeEntry {
2241+ class_name : "f1_darkTheme" . to_string ( ) ,
2242+ css_vars : vec ! [ ( "--color-primary" . to_string( ) , "white" . to_string( ) ) ] ,
2243+ exported : true ,
2244+ vars_name : None ,
2245+ vars_object_json : None ,
2246+ } ,
2247+ ) ;
2248+
2249+ let code = super :: collected_styles_to_code ( & collected, "@devup-ui/react" ) ;
2250+ assert ! ( code. contains( "export const darkTheme = \" f1_darkTheme\" " ) ) ;
2251+ }
2252+
2253+ #[ test]
2254+ fn test_collected_styles_to_code_with_keyframes ( ) {
2255+ let mut collected = CollectedStyles :: default ( ) ;
2256+ collected. keyframes . insert (
2257+ "fadeIn" . to_string ( ) ,
2258+ StyleEntry {
2259+ json : r#"{"from":{"opacity":"0"},"to":{"opacity":"1"}}"# . to_string ( ) ,
2260+ exported : true ,
2261+ bases : Vec :: new ( ) ,
2262+ } ,
2263+ ) ;
2264+
2265+ let code = super :: collected_styles_to_code ( & collected, "@devup-ui/react" ) ;
2266+ assert ! ( code. contains( "import { keyframes } from '@devup-ui/react'" ) ) ;
2267+ assert ! ( code. contains( "export const fadeIn = keyframes" ) ) ;
2268+ }
2269+
2270+ #[ test]
2271+ fn test_collected_styles_to_code_with_global_styles ( ) {
2272+ let mut collected = CollectedStyles :: default ( ) ;
2273+ collected
2274+ . global_styles
2275+ . push ( ( "body" . to_string ( ) , r#"{"margin":"0"}"# . to_string ( ) ) ) ;
2276+
2277+ let code = super :: collected_styles_to_code ( & collected, "@devup-ui/react" ) ;
2278+ assert ! ( code. contains( "import { globalCss } from '@devup-ui/react'" ) ) ;
2279+ assert ! ( code. contains( "globalCss({ \" body\" :" ) ) ;
2280+ }
2281+
2282+ #[ test]
2283+ fn test_collected_styles_to_code_composition ( ) {
2284+ let mut collected = CollectedStyles :: default ( ) ;
2285+ // Add base style
2286+ collected. styles . insert (
2287+ "baseStyle" . to_string ( ) ,
2288+ StyleEntry {
2289+ json : r#"{"padding":"16px","margin":"8px"}"# . to_string ( ) ,
2290+ exported : false ,
2291+ bases : Vec :: new ( ) ,
2292+ } ,
2293+ ) ;
2294+ // Add composed style
2295+ collected. styles . insert (
2296+ "buttonStyle" . to_string ( ) ,
2297+ StyleEntry {
2298+ json : r#"{"background":"blue"}"# . to_string ( ) ,
2299+ exported : true ,
2300+ bases : vec ! [ "baseStyle" . to_string( ) ] ,
2301+ } ,
2302+ ) ;
2303+
2304+ let code = super :: collected_styles_to_code ( & collected, "@devup-ui/react" ) ;
2305+ // Both base and own styles should be present in the composed style
2306+ assert ! ( code. contains( "padding" ) ) ;
2307+ assert ! ( code. contains( "background" ) ) ;
2308+ }
21752309}
0 commit comments