comparejson.monkey2 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. Namespace mojo3d.jsonifier
  2. Function CompareJson:Int( x:JsonObject,y:JsonValue )
  3. If y=JsonValue.NullValue Return 1
  4. Local r:=Cast<JsonObject>( y )
  5. If Not r Return 1
  6. Local xit:=x.All(),rit:=r.All()
  7. While Not xit.AtEnd And Not rit.AtEnd
  8. Local cmp:=xit.Current.Key<=>rit.Current.Key
  9. If cmp Return cmp
  10. cmp=CompareJson( xit.Current.Value,rit.Current.Value )
  11. If cmp Return cmp
  12. xit.Bump()
  13. rit.Bump()
  14. Wend
  15. Return x.Count()<=>r.Count()
  16. End
  17. Function CompareJson:Int( x:JsonArray,y:JsonValue )
  18. If y=JsonValue.NullValue Or y.IsBool Or y.IsNumber Or y.IsString Return 1
  19. Local r:=Cast<JsonArray>( y )
  20. If Not r Return -1
  21. For Local i:=0 Until Min( x.Length,r.Length )
  22. Local cmp:=CompareJson( x[i],r[i] )
  23. If cmp Return cmp
  24. Next
  25. Return x.Length<=>r.Length
  26. End
  27. Function CompareJson:Int( x:JsonString,y:JsonValue )
  28. If y=JsonValue.NullValue Or y.IsBool Or y.IsNumber Return 1
  29. Local r:=Cast<JsonString>( y )
  30. Return r ? x.Data<=>r.Data Else -1
  31. End
  32. Function CompareJson:Int( x:JsonNumber,y:JsonValue )
  33. If y=JsonValue.NullValue Or y.IsBool Return 1
  34. Local r:=Cast<JsonNumber>( y )
  35. Return r ? x.Data<=>r.Data Else -1
  36. End
  37. Function CompareJson:Int( x:JsonBool,y:JsonValue )
  38. If y=JsonValue.NullValue Return 1
  39. Local r:=Cast<JsonBool>( y )
  40. Return r ? x.Data<=>r.Data Else -1
  41. End
  42. Function CompareJson:Int( x:JsonValue,y:JsonValue )
  43. If x=JsonValue.NullValue Return y=JsonValue.NullValue ? 0 Else -1
  44. Local jbool:=Cast<JsonBool>( x )
  45. If jbool Return CompareJson( jbool,y )
  46. Local jnumber:=Cast<JsonNumber>( x )
  47. If jnumber Return CompareJson( jnumber,y )
  48. Local jstring:=Cast<JsonString>( x )
  49. If jstring Return CompareJson( jstring,y )
  50. local jarray:=Cast<JsonArray>( x )
  51. If jarray Return CompareJson( jarray,y )
  52. Local jobj:=Cast<JsonObject>( x )
  53. If jobj Return CompareJson( jobj,y )
  54. RuntimeError( "TODO" )
  55. Return 0
  56. End
  57. #rem
  58. Function RndJson:JsonValue( range:Int=6 )
  59. Select Int( Rnd( range ) )
  60. Case 0
  61. Return JsonValue.NullValue
  62. Case 1
  63. Return Rnd()>.5 ? JsonBool.TrueValue Else JsonBool.FalseValue
  64. Case 2
  65. Return New JsonNumber( Rnd(10000) )
  66. Case 3
  67. Return New JsonString( Rnd(10000) )
  68. Case 4
  69. Local data:=New Stack<JsonValue>( Rnd( 10,20 ) )
  70. For Local i:=0 Until data.Length
  71. data[i]=RndJson( 4 )
  72. Next
  73. Return New JsonArray( data )
  74. Case 5
  75. Local data:=New StringMap<JsonValue>
  76. For Local i:=0 Until Rnd( 10,20 )
  77. data[ Rnd(100) ]=RndJson( 4 )
  78. Next
  79. Return New JsonObject( data )
  80. End
  81. Return Null
  82. End
  83. Function Main()
  84. Print "Start..."
  85. For Local i:=1 To 100000
  86. Local x:=RndJson()
  87. Local y:=RndJson()
  88. Local cmp1:=CompareJson( x,y )
  89. Local cmp2:=CompareJson( y,x )
  90. If cmp1<0 Assert( cmp2>=0 )
  91. If cmp1=0 Assert( cmp2 =0 )
  92. If cmp1>0 Assert( cmp2<=0 )
  93. End
  94. Print "Success!"
  95. End
  96. #end