@@ -139,8 +139,10 @@ fn lisp_quoted() {
139139}
140140
141141#[ test]
142- fn numeric_like_symbols ( ) {
142+ fn numeric_like_symbols_keywords ( ) {
143143 assert_eq ! ( edn:: read_string( "-foobar" ) . unwrap( ) , Edn :: Symbol ( "-foobar" ) ) ;
144+ assert_eq ! ( edn:: read_string( "-:thi#n=g" ) . unwrap( ) , Edn :: Symbol ( "-:thi#n=g" ) ) ;
145+ assert_eq ! ( edn:: read_string( ":thi#n=g" ) . unwrap( ) , Edn :: Key ( "thi#n=g" ) ) ;
144146
145147 assert_eq ! (
146148 edn:: read_string( "(+foobar +foo+bar+ +'- '-+)" ) . unwrap( ) ,
@@ -238,7 +240,7 @@ fn tagged() {
238240}
239241
240242#[ test]
241- fn test_default_map_namespace_syntax ( ) {
243+ fn default_map_namespace_syntax ( ) {
242244 // see https://github.com/Grinkers/clojure-reader/issues/2
243245 let variations = [
244246 "{:thingy #:foo{:bar \" baz\" } :more \" stuff\" }" ,
@@ -282,3 +284,50 @@ fn test_default_map_namespace_syntax() {
282284 assert_eq ! ( cfg. get( & Edn :: Key ( "more" ) ) , Some ( & Edn :: Str ( "stuff" ) ) ) ;
283285 }
284286}
287+
288+ #[ test]
289+ fn namespace_syntax_edge_cases ( ) {
290+ let edn_data = edn:: read_string ( r#"#:thingy {:f#猫o "bar" :baz/bar "qux" 42 24}"# ) . unwrap ( ) ;
291+
292+ assert_eq ! ( edn_data. get( & Edn :: Key ( "thingy/f#猫o" ) ) , Some ( & Edn :: Str ( "bar" ) ) ) ;
293+ assert_eq ! ( edn_data. get( & Edn :: Key ( "baz/bar" ) ) , Some ( & Edn :: Str ( "qux" ) ) ) ;
294+ assert_eq ! ( edn_data. get( & Edn :: Key ( "foo" ) ) , None ) ;
295+ assert_eq ! ( edn_data. get( & Edn :: Key ( "baz" ) ) , None ) ;
296+ assert_eq ! ( edn_data. get( & Edn :: Key ( ":baz/bar" ) ) , None ) ;
297+ assert_eq ! ( edn_data. get( & Edn :: Key ( "thingy/" ) ) , None ) ;
298+ assert_eq ! ( edn_data. get( & Edn :: Key ( "thingy" ) ) , None ) ;
299+ assert_eq ! ( edn_data. get( & Edn :: Key ( "thingything" ) ) , None ) ;
300+
301+ let edn_data = edn:: read_string ( r#"#thingy {:f#猫o "bar" :baz/bar "qux" 42 24}"# ) . unwrap ( ) ;
302+ assert_eq ! ( edn_data. get( & Edn :: Key ( "thingy/f#猫o" ) ) , None ) ;
303+ assert_eq ! ( edn_data. get( & Edn :: Key ( "baz/bar" ) ) , None ) ;
304+ }
305+
306+ #[ test]
307+ fn get_contains ( ) {
308+ let edn_data = edn:: read_string ( r#"{:f#猫o "bar" :baz/bar "qux" 42 24}"# ) . unwrap ( ) ;
309+ assert_eq ! ( edn_data. get( & Edn :: Key ( "f#猫o" ) ) , Some ( & Edn :: Str ( "bar" ) ) ) ;
310+ assert_eq ! ( edn_data. contains( & Edn :: Key ( "f#猫o" ) ) , true ) ;
311+ assert_eq ! ( edn_data. get( & Edn :: Key ( "foo" ) ) , None ) ;
312+ assert_eq ! ( edn_data. contains( & Edn :: Key ( "foo" ) ) , false ) ;
313+
314+ let edn_data = edn:: read_string ( r#"#{:f#猫o "bar" :baz/bar "qux" 42 24}"# ) . unwrap ( ) ;
315+ assert_eq ! ( edn_data. contains( & Edn :: Key ( "f#猫o" ) ) , true ) ;
316+ assert_eq ! ( edn_data. contains( & Edn :: Int ( 42 ) ) , true ) ;
317+ assert_eq ! ( edn_data. contains( & Edn :: Key ( "foo" ) ) , false ) ;
318+
319+ let edn_data = edn:: read_string ( r#"[:f#猫o "bar" :baz/bar "qux" 42 24]"# ) . unwrap ( ) ;
320+ assert_eq ! ( edn_data. contains( & Edn :: Key ( "f#猫o" ) ) , true ) ;
321+ assert_eq ! ( edn_data. contains( & Edn :: Int ( 42 ) ) , true ) ;
322+ assert_eq ! ( edn_data. contains( & Edn :: Key ( "foo" ) ) , false ) ;
323+
324+ let edn_data = edn:: read_string ( r#"(:f#猫o "bar" :baz/bar "qux" 42 24)"# ) . unwrap ( ) ;
325+ assert_eq ! ( edn_data. contains( & Edn :: Key ( "f#猫o" ) ) , true ) ;
326+ assert_eq ! ( edn_data. contains( & Edn :: Int ( 42 ) ) , true ) ;
327+ assert_eq ! ( edn_data. contains( & Edn :: Key ( "foo" ) ) , false ) ;
328+
329+ let edn_data = edn:: read_string ( r#"42"# ) . unwrap ( ) ;
330+ assert_eq ! ( edn_data. contains( & Edn :: Key ( "f#猫o" ) ) , false ) ;
331+ assert_eq ! ( edn_data. contains( & Edn :: Int ( 42 ) ) , false ) ;
332+ assert_eq ! ( edn_data. contains( & Edn :: Key ( "foo" ) ) , false ) ;
333+ }
0 commit comments