> >> the correct solution is to make the check order independent. For
> >> example:
> >> string s = CallReturningJSON();
> >> s = replace(s,`"a":23.54`, `X`);
> >> s = replace(s,`"b":0.0012`, `X`);
> >> s = replace(s,`{"nested":{X,X}}`, `X`);
> >> s = replace(s,`"goodbye":[true,"or",false,["test",42,X]]`, `X`);
> >> s = replace(s,`"array":[12,null,{}]`, `Y`);
> >> s = replace(s,"is\n\ngreat", `Z`);
> >> s = replace(s,`"json":Z`, `Y`);
> >> s = replace(s,`"hello":{Y,Y}`, `X`);
> >> assert(s == `{X,X}`);.
> >
> > But this is lengthy and seems to lack additional assert checks.
> >
> It's a little wordy but it has one line per things it is checking. And 
> adjusting it to give more asserts is trivial.

The order of name/value pairs in JSON objects is as unspecified as the order of 
foreach iteration for associative arrays.
So, agreed, you would have to unittest a serialization against all permutations.
But then, JSON has a jew more unspecified gaps like "whitespace can be inserted 
between any pair of tokens".
Shall we rely on the fact that the implementation currently does not insert 
whitespace between tokens?
This would work for the unittest of std.json, but what's with the unittest of 
an implementation using std.json?
Or, shall we implement a tokenizer in the unittest to get rid of extra 
whitespace between tokens?

> > Until then, broken unit tests pass...
> >
> Spot on. The unittest is broken. Not the thing it's testing and not foreach.

Maybe, the thing under test is not broken.
But there seems to be something wrong with the thing when it forces you to 
examine the unspecified result of toString in a unittest.
I mean, it would have been easy for the author of the code to provide 
toCanonicalJSON, and a lot easier for users of the code.

And, of course, foreach is not broken.
But D removes a lot of unspecified gaps that make life hard in C or C++.
And you have to provide opCmp in order to put your own keys into an associative 
array, so why don't you get them out in order?

However, let's get things done: can the attached unittest be an acceptatble 
replacement for the broken one of std.json?
begin 644 json-unittest.d
M=6YI='1E<W0@>PH@("`...@+r\@06X@;W9E<FQY('-I;7!L92!T97-T('-U:71E
M+"!I9B!I="!C86X@<&%R<v...@82!s97)I86QI>F5D('-T<FEN9R!A;F0*("`@
M("\O('1h...@=7-e('1H92!R97-U;'1I;F<@=F%L=65S('1r...@=&\...@9v5n
M97)A=&4...@86x@:61E;G1I8V%L"B`@("`O+R!S97)I86QI>F%T:6]N+"!B;W1H
M('1H92!D96-O9&5R(&%N9"!E;F-O9&5R('=O<f...@h*("`@($I33TY686QU
M92!V86QU93L*("`@('-T<FEN9R!J<V]N.PH@("`@"B`@("!V86QU92`]('!A
M<G-E2E-/3BA@;G5L;&`I+"!A<W-E<G0H=&]*4T].*"9V86QU92D@/3...@8&YU
M;&q...@*3l*("`@('9A;'5E(#T@<&%R<V5*4T].*&!T<G5E8"DL(&%S<V5R="AT
M;TI33TXH)G9A;'5E*2`]/2...@=')U96`I.PH@("`...@=f%l=64@/2!P87)S94I3
M3TXH8&9A;'-E8"DL(&%S<V5R="AT;TI33TXH)G9A;'5E*2`]/2...@9f%l<V5@
M*3L*("`@('9A;'5E(#T@<&%R<V5*4T].*&`P8"DL(&%S<V5R="AT;TI33TXH
M)G9A;'5E*2`]/2!@,&`I.PH@("`...@=f%l=64@/2!P87)S94I33TXH8#$R,V`I
M+"!A<W-E<G0H=&]*4T].*"9V86QU92D@/3...@8#$r,V`I.PH@("`...@=f%l=64@
M/2!P87)S94I33TXH8"TT,S(Q8"DL(&%S<V5R="AT;TI33TXH)G9A;'5E*2`]
M/2...@+30s,c...@*3l*("`@('9A;'5E(#T@<&%R<V5*4T].*&`P+C(S8"DL(&%S
M<V5R="AT;TI33TXH)G9A;'5E*2`]/2!@,"XR,V`I.PH@("`...@=f%l=64@/2!P
M87)S94I33TXH8"TP+C(S8"DL(&%S<V5R="AT;TI33TXH)G9A;'5E*2`]/2!@
M+3`N,c...@*3l*("`@('9A;'5E(#T@<&%R<V5*4T].*&!N=6QL8"DL(&%S<V5R
M="AT;TI33TXH)G9A;'5E*2`]/2!@;G5L;&`I.PH@("`...@=f%l=64@/2!P87)S
M94I33TXH8"(B8"DL(&%S<V5R="AT;TI33TXH)G9A;'5E*2`]/2!@(B)@*3L*
M("`@('9A;'5E(#T@<&%R<V5*4T].*&`Q+C(R,V4K,c...@*2p@87-S97)T*'1O
M2E-/3...@f=f%l=64i(#T](&`Q+C(R,V4K,c...@*3l*("`@('9A;'5E(#T@<&%R
M<V5*4T].*&`B:&5L;&]<;G=O<FQD(F`I+"!A<W-E<G0H=&]*4T].*"9V86QU
M92D@/3...@8")H96QL;UQN=V]R;&0B8"D["B`@("!V86QU92`]('!A<G-E2E-/
M3BA@(EPB7%Q<+UQB7&9<;EQR7'0B8"DL(&%S<V5R="AT;TI33TXH)G9A;'5E
M*2`]/2!@(EPB7%Q<+UQB7&9<;EQR7'0B8"D["B`@("!V86QU92`]('!A<G-E
M2E-/3...@6uu@*...@87-s97)T*'1O2E-/3...@f=f%l=64i(#T](&!;76`I.PH@
M("`...@=f%l=64@/2!P87)S94I33TXH8%LQ,BPB9F]O(BQT<G5E+&9A;'-E76`I
M+"!A<W-E<G0H=&]*4T].*"9V86QU92D@/3...@8%lq,BPB9F]O(BQT<G5E+&9A
M;'-E76`I.PH@("`...@=f%l=64@/2!P87)S94I33TXH8'M]8"DL(&%S<V5R="AT
M;TI33TXH)G9A;'5E*2`]/2!@>w...@*3l*("`@('9A;'5E(#T@<&%R<V5*4T].
M*&![(F$B.C$L(F(B.FYU;&Q]8"D["@H@("`@:G-O;B`]('1O2E-/3...@f=f%l
m=64i...@+r\@;W)D97(@;V8@;F%M92]V86QU92!P86ER<R!I;B!*4T].(&]B
M:F5C=',@:7,@=6YS<&5C:69I960*("`@(&%S<V5R="AJ<V]N(#T](&![(F$B
M.C$L(F(B.FYU;&Q]8"!\?"!J<V]N(#T](&![(F(B.FYU;&PL(F$B.C%]8"D[
M"@H@("`...@=f%l=64@/2!P87)S94I33TXH8'LB:&5L;&\B.GLB:G-O;B(Z(FES
M(&=R96%T(BPB87)R87DB.ELQ,BQN=6QL+'M]77TL8`H@("`@("`@("`@("`@
M("`@("`@("`...@8")G;V]D8GEE(CI;=')U92PB;W(B+&9A;'-E+%LB=&5S="(L
M-#(L>R)N97-T960B.GLB82(Z,C,N-30L(F(B.C`N,#`Q,GU]75U]8"D["B`@
M("!J<V]N(#...@=&]*4T].*"9V86QU92D[("`O+R!O<F1E<B!O9B!N86UE+W9A
M;'5E('!A:7)S(&EN($I33TX@;V)J96-T<R!I<R!U;G-P96-I9FEE9`H@("`@
M87-S97)T*&EN9&5X3V8H:G-O;b...@8'LB:G-O;B(Z(FES(&=R96%T(BPB87)R
M87DB.ELQ,BQN=6QL+'m]...@*2`a/2`M,2!\?`H@("`@("`@("`@(&EN9&5X
M3V8H:G-O;b...@8'LB87)R87DB.ELQ,BQN=6QL+'M]72PB:G-O;B(Z(FES(&=R
M96%T(g...@*2`a/2`M,2D["B`@("!J<V]N(#T@<F5P;&%C92AJ<V]N+"!@>R)J
M<V]N(CHB:7,@9W)E870B+")A<G)A>2(Z6S$R+&YU;&PL>WU=?6`L(&![(F%R
M<F%Y(CI;,3(L;G5L;"Q[?5TL(FIS;VXB.B)I<R!G<F5A=")]8"D["B`@("!A
M<W-E<G0H:6YD97A/9BAJ<V]N+"!@>R)A(CHR,RXU-"PB8B(Z,"XP,#$R?6`I
M("$]("TQ('Q\"B`@("`@("`@("`@:6YD97A/9BAJ<V]N+"!@>R)B(CHP+C`P
M,3(L(F$B.C(S+C4T?6`I("$]("TQ*3L*("`@("!J<V]N(#T@<F5P;&%C92AJ
M<V]N+"!@>R)B(CHP+C`P,3(L(F$B.C(S+C4T?6`L(&![(F$B.C(S+C4T+")B
M(CHP+C`P,3)]8"D["B`@("`...@87-s97)T*&IS;VX@/3U@>R)G;V]D8GEE(CI;
M=')U92PB;W(B+&9A;'-E+%LB=&5S="(L-#(L>R)N97-T960B.GLB82(Z,C,N
M-30L(F(B.C`N,#`Q,GU]75TL8`H@("`@("`@("`@("`@("`@("`...@8")H96QL
M;R(Z>R)A<G)A>2(Z6S$R+&YU;&PL>WU=+")J<V]N(CHB:7,@9W)E870B?7U@
M('Q\"B`@("`@("`@("`@(&IS;VX@/3...@8'LB:&5L;&\B.GLB87)R87DB.ELQ
M,BQN=6QL+'M]72PB:G-O;B(Z(FES(&=R96%T(GTL8`H@("`@("`@("`@("`@
M("`@("`@(&`B9V]O9&)Y92(Z6W1R=64L(F]R(BQF86QS92Q;(G1E<W0B+#0R
M+'LB;F5S=&5D(CI[(F$B.C(S+C4T+")B(CHP+C`P,3)]?5U=?6`I.PI]"@``
`
end

Reply via email to