123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- Namespace mojo3d.jsonifier
- Function CompareJson:Int( x:JsonObject,y:JsonValue )
- If y=JsonValue.NullValue Return 1
- Local r:=Cast<JsonObject>( y )
- If Not r Return 1
- Local xit:=x.All(),rit:=r.All()
- While Not xit.AtEnd And Not rit.AtEnd
- Local cmp:=xit.Current.Key<=>rit.Current.Key
- If cmp Return cmp
- cmp=CompareJson( xit.Current.Value,rit.Current.Value )
- If cmp Return cmp
- xit.Bump()
- rit.Bump()
- Wend
- Return x.Count()<=>r.Count()
- End
- Function CompareJson:Int( x:JsonArray,y:JsonValue )
- If y=JsonValue.NullValue Or y.IsBool Or y.IsNumber Or y.IsString Return 1
- Local r:=Cast<JsonArray>( y )
- If Not r Return -1
- For Local i:=0 Until Min( x.Length,r.Length )
- Local cmp:=CompareJson( x[i],r[i] )
- If cmp Return cmp
- Next
- Return x.Length<=>r.Length
- End
- Function CompareJson:Int( x:JsonString,y:JsonValue )
- If y=JsonValue.NullValue Or y.IsBool Or y.IsNumber Return 1
- Local r:=Cast<JsonString>( y )
- Return r ? x.Data<=>r.Data Else -1
- End
- Function CompareJson:Int( x:JsonNumber,y:JsonValue )
- If y=JsonValue.NullValue Or y.IsBool Return 1
- Local r:=Cast<JsonNumber>( y )
- Return r ? x.Data<=>r.Data Else -1
- End
- Function CompareJson:Int( x:JsonBool,y:JsonValue )
- If y=JsonValue.NullValue Return 1
- Local r:=Cast<JsonBool>( y )
- Return r ? x.Data<=>r.Data Else -1
- End
- Function CompareJson:Int( x:JsonValue,y:JsonValue )
- If x=JsonValue.NullValue Return y=JsonValue.NullValue ? 0 Else -1
- Local jbool:=Cast<JsonBool>( x )
- If jbool Return CompareJson( jbool,y )
- Local jnumber:=Cast<JsonNumber>( x )
- If jnumber Return CompareJson( jnumber,y )
- Local jstring:=Cast<JsonString>( x )
- If jstring Return CompareJson( jstring,y )
- local jarray:=Cast<JsonArray>( x )
- If jarray Return CompareJson( jarray,y )
- Local jobj:=Cast<JsonObject>( x )
- If jobj Return CompareJson( jobj,y )
- RuntimeError( "TODO" )
- Return 0
- End
- #rem
- Function RndJson:JsonValue( range:Int=6 )
-
- Select Int( Rnd( range ) )
- Case 0
- Return JsonValue.NullValue
- Case 1
- Return Rnd()>.5 ? JsonBool.TrueValue Else JsonBool.FalseValue
- Case 2
- Return New JsonNumber( Rnd(10000) )
- Case 3
- Return New JsonString( Rnd(10000) )
- Case 4
- Local data:=New Stack<JsonValue>( Rnd( 10,20 ) )
- For Local i:=0 Until data.Length
- data[i]=RndJson( 4 )
- Next
- Return New JsonArray( data )
- Case 5
- Local data:=New StringMap<JsonValue>
- For Local i:=0 Until Rnd( 10,20 )
- data[ Rnd(100) ]=RndJson( 4 )
- Next
- Return New JsonObject( data )
- End
- Return Null
- End
- Function Main()
-
- Print "Start..."
-
- For Local i:=1 To 100000
-
- Local x:=RndJson()
- Local y:=RndJson()
-
- Local cmp1:=CompareJson( x,y )
- Local cmp2:=CompareJson( y,x )
-
- If cmp1<0 Assert( cmp2>=0 )
- If cmp1=0 Assert( cmp2 =0 )
- If cmp1>0 Assert( cmp2<=0 )
- End
-
- Print "Success!"
-
- End
- #end
|