anchor.diff:         {Def, {Off, Size, Value}}, struct_data(),
          begin
              Root = root(Def),
  +           %% note: value is binary
              ok = ecapnp_ref:write_struct_data(Off, Size, Value, Root),
              Value =:= ecapnp_ref:read_struct_data(Off, Size, Root)
          end).
  
positive.code: 
  %% create new message and get a ref to the root element
  root(A1, A2) -> root(data(A1, A2)).
  
negative.code: data_value() ->
      union(
        [?LET(B, boolean(), {1, bool, B}),
         ?LET(I, integer(-16#80, 16#7f), {8, int8, I}),
         ?LET(I, integer(-16#8000, 16#7fff), {16, int16, I}),
         ?LET(I, integer(-16#80000000, 16#7fffffff), {32, int32, I}),
         ?LET(I, integer(-16#8000000000000000, 16#7fffffffffffffff), {64, int64, I}),
         ?LET(I, integer(0, 16#ff), {8, uint8, I}),
         ?LET(I, integer(0, 16#ffff), {16, uint16, I}),
         ?LET(I, integer(0, 16#ffffffff), {32, uint32, I}),
         ?LET(I, integer(0, 16#ffffffffffffffff), {64, uint64, I}),
         ?LET(F, float(-3.4e38, 3.4e38), {32, float32, F}), %% bound it to just under 32 bit
         ?LET(F, float(), {64, float64, F}), %% erlang floats are 64 bit
         ?LET([{S, T}, V], %% test infinity and NaN values..
              [union([{32, float32}, {64, float64}]),
               union([nan, inf, '-inf'])],
              {S, T, V})
        ]).
  
  %% struct ref with at least one word of data
  