@@ -2861,6 +2861,118 @@ func TestCompareYAMLNodes_ComplexNodes(t *testing.T) {
28612861 assert .False (t , result2 )
28622862}
28632863
2864+ func TestComparableScalarTagAndValue (t * testing.T ) {
2865+ t .Run ("nil node" , func (t * testing.T ) {
2866+ tag , value := comparableScalarTagAndValue (nil )
2867+ assert .Empty (t , tag )
2868+ assert .Empty (t , value )
2869+ })
2870+
2871+ t .Run ("non scalar node" , func (t * testing.T ) {
2872+ node := utils .CreateEmptyMapNode ()
2873+ tag , value := comparableScalarTagAndValue (node )
2874+ assert .Equal (t , node .Tag , tag )
2875+ assert .Equal (t , node .Value , value )
2876+ })
2877+
2878+ t .Run ("non numeric scalar" , func (t * testing.T ) {
2879+ node := utils .CreateStringNode ("pizza" )
2880+ tag , value := comparableScalarTagAndValue (node )
2881+ assert .Equal (t , "!!str" , tag )
2882+ assert .Equal (t , "pizza" , value )
2883+ })
2884+
2885+ t .Run ("numeric scalar normalizes" , func (t * testing.T ) {
2886+ node := & yaml.Node {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "1e-08" }
2887+ tag , value := comparableScalarTagAndValue (node )
2888+ assert .Equal (t , "!!number" , tag )
2889+ assert .Equal (t , "1/100000000" , value )
2890+ })
2891+
2892+ t .Run ("numeric scalar fallback" , func (t * testing.T ) {
2893+ node := & yaml.Node {Kind : yaml .ScalarNode , Tag : "!!float" , Value : ".inf" }
2894+ tag , value := comparableScalarTagAndValue (node )
2895+ assert .Equal (t , "!!float" , tag )
2896+ assert .Equal (t , ".inf" , value )
2897+ })
2898+ }
2899+
2900+ func TestCompareYAMLNodes_NumericScalarEquivalence (t * testing.T ) {
2901+ tests := []struct {
2902+ name string
2903+ left * yaml.Node
2904+ right * yaml.Node
2905+ equal bool
2906+ }{
2907+ {
2908+ name : "equivalent exponent formatting" ,
2909+ left : & yaml.Node {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "1e-08" },
2910+ right : & yaml.Node {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "1e-8" },
2911+ equal : true ,
2912+ },
2913+ {
2914+ name : "equivalent int and float formatting" ,
2915+ left : & yaml.Node {Kind : yaml .ScalarNode , Tag : "!!int" , Value : "1" },
2916+ right : & yaml.Node {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "1.0" },
2917+ equal : true ,
2918+ },
2919+ {
2920+ name : "different numeric values" ,
2921+ left : & yaml.Node {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "1e-08" },
2922+ right : & yaml.Node {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "2e-08" },
2923+ equal : false ,
2924+ },
2925+ {
2926+ name : "string and numeric stay different" ,
2927+ left : & yaml.Node {Kind : yaml .ScalarNode , Tag : "!!str" , Value : "1.0" },
2928+ right : & yaml.Node {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "1.0" },
2929+ equal : false ,
2930+ },
2931+ }
2932+
2933+ for _ , tt := range tests {
2934+ t .Run (tt .name , func (t * testing.T ) {
2935+ assert .Equal (t , tt .equal , CompareYAMLNodes (tt .left , tt .right ))
2936+ })
2937+ }
2938+ }
2939+
2940+ func TestCompareYAMLNodes_ComplexNodesNumericEquivalence (t * testing.T ) {
2941+ left := & yaml.Node {
2942+ Kind : yaml .MappingNode ,
2943+ Content : []* yaml.Node {
2944+ {Kind : yaml .ScalarNode , Tag : "!!str" , Value : "default" },
2945+ {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "0.10" },
2946+ {Kind : yaml .ScalarNode , Tag : "!!str" , Value : "items" },
2947+ {
2948+ Kind : yaml .SequenceNode ,
2949+ Content : []* yaml.Node {
2950+ {Kind : yaml .ScalarNode , Tag : "!!int" , Value : "1" },
2951+ {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "1e-08" },
2952+ },
2953+ },
2954+ },
2955+ }
2956+
2957+ right := & yaml.Node {
2958+ Kind : yaml .MappingNode ,
2959+ Content : []* yaml.Node {
2960+ {Kind : yaml .ScalarNode , Tag : "!!str" , Value : "items" },
2961+ {
2962+ Kind : yaml .SequenceNode ,
2963+ Content : []* yaml.Node {
2964+ {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "1.0" },
2965+ {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "1e-8" },
2966+ },
2967+ },
2968+ {Kind : yaml .ScalarNode , Tag : "!!str" , Value : "default" },
2969+ {Kind : yaml .ScalarNode , Tag : "!!float" , Value : "0.1" },
2970+ },
2971+ }
2972+
2973+ assert .True (t , CompareYAMLNodes (left , right ))
2974+ }
2975+
28642976func TestGenerateHashString_SchemaProxyNoCache (t * testing.T ) {
28652977 // Test that SchemaProxy types don't get cached (shouldCache = false)
28662978 // We can't easily test this without creating actual SchemaProxy objects
0 commit comments