@@ -205,4 +205,95 @@ mod tests {
205205 let err = result. unwrap_err ( ) ;
206206 assert ! ( err. to_string( ) . contains( "Cannot stringify type" ) ) ;
207207 }
208+
209+ #[ test]
210+ fn test_parse_json_value_simple ( ) {
211+ // Null
212+ assert_eq ! (
213+ parse_json_value( serde_json:: Value :: Null ) ,
214+ RuntimeValue :: Null
215+ ) ;
216+
217+ // Bool
218+ assert_eq ! (
219+ parse_json_value( serde_json:: Value :: Bool ( true ) ) ,
220+ RuntimeValue :: Bool ( true )
221+ ) ;
222+ assert_eq ! (
223+ parse_json_value( serde_json:: Value :: Bool ( false ) ) ,
224+ RuntimeValue :: Bool ( false )
225+ ) ;
226+
227+ // Int
228+ assert_eq ! (
229+ parse_json_value( serde_json:: Value :: Number ( serde_json:: Number :: from( 42 ) ) ) ,
230+ RuntimeValue :: Int ( 42 )
231+ ) ;
232+ assert_eq ! (
233+ parse_json_value( serde_json:: Value :: Number ( serde_json:: Number :: from( -10 ) ) ) ,
234+ RuntimeValue :: Int ( -10 )
235+ ) ;
236+
237+ // Float
238+ assert_eq ! (
239+ parse_json_value( serde_json:: Value :: Number (
240+ serde_json:: Number :: from_f64( 3.14 ) . unwrap( )
241+ ) ) ,
242+ RuntimeValue :: Float ( 3.14 )
243+ ) ;
244+
245+ // String
246+ assert_eq ! (
247+ parse_json_value( serde_json:: Value :: String ( "hello" . to_string( ) ) ) ,
248+ RuntimeValue :: Str ( "hello" . to_string( ) )
249+ ) ;
250+ }
251+
252+ #[ test]
253+ fn test_parse_json_value_complex ( ) {
254+ // Array
255+ let arr = serde_json:: Value :: Array ( vec ! [
256+ serde_json:: Value :: Number ( serde_json:: Number :: from( 1 ) ) ,
257+ serde_json:: Value :: String ( "two" . to_string( ) ) ,
258+ serde_json:: Value :: Bool ( false ) ,
259+ ] ) ;
260+ let parsed_arr = parse_json_value ( arr) ;
261+ match parsed_arr {
262+ RuntimeValue :: List { items, is_const } => {
263+ assert ! ( !is_const) ;
264+ let borrowed = items. borrow ( ) ;
265+ assert_eq ! ( borrowed. len( ) , 3 ) ;
266+ assert_eq ! ( borrowed[ 0 ] , RuntimeValue :: Int ( 1 ) ) ;
267+ assert_eq ! ( borrowed[ 1 ] , RuntimeValue :: Str ( "two" . to_string( ) ) ) ;
268+ assert_eq ! ( borrowed[ 2 ] , RuntimeValue :: Bool ( false ) ) ;
269+ }
270+ _ => panic ! ( "Expected RuntimeValue::List" ) ,
271+ }
272+
273+ // Object
274+ let mut obj_map = serde_json:: Map :: new ( ) ;
275+ obj_map. insert (
276+ "key1" . to_string ( ) ,
277+ serde_json:: Value :: Number ( serde_json:: Number :: from ( 100 ) ) ,
278+ ) ;
279+ obj_map. insert (
280+ "key2" . to_string ( ) ,
281+ serde_json:: Value :: String ( "value2" . to_string ( ) ) ,
282+ ) ;
283+ let obj = serde_json:: Value :: Object ( obj_map) ;
284+ let parsed_obj = parse_json_value ( obj) ;
285+ match parsed_obj {
286+ RuntimeValue :: Map { entries, is_const } => {
287+ assert ! ( !is_const) ;
288+ let borrowed = entries. borrow ( ) ;
289+ assert_eq ! ( borrowed. len( ) , 2 ) ;
290+ assert_eq ! ( borrowed. get( "key1" ) . unwrap( ) , & RuntimeValue :: Int ( 100 ) ) ;
291+ assert_eq ! (
292+ borrowed. get( "key2" ) . unwrap( ) ,
293+ & RuntimeValue :: Str ( "value2" . to_string( ) )
294+ ) ;
295+ }
296+ _ => panic ! ( "Expected RuntimeValue::Map" ) ,
297+ }
298+ }
208299}
0 commit comments