static void testRead(String x, Binding... bindings) {
    Tokenizer t = TokenizerFactory.makeTokenizerString(x);
    BindingInputStream inStream = new BindingInputStream(t);

    if (bindings.length == 0) {
      for (; inStream.hasNext(); ) inStream.next();
      return;
    }

    int i;
    for (i = 0; inStream.hasNext(); i++) {
      Binding b = inStream.next();
      assertTrue(
          "Bindings do not match: expected=" + bindings[i] + " got=" + b,
          equalBindings(bindings[i], b));
    }

    assertEquals("Wrong length: expect= " + bindings.length + " got=" + i, bindings.length, i);
  }
  static void testWriteRead(PrefixMap prefixMap, Binding... bindings) {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    BindingOutputStream output = new BindingOutputStream(out, prefixMap);

    for (Binding b : bindings) output.write(b);
    output.flush();

    // When the going gets tough, the tough put in trace statements:
    // System.out.println("T: \n"+out.toString()) ;

    ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
    BindingInputStream input = new BindingInputStream(in);

    List<Binding> results = new ArrayList<Binding>();
    for (; input.hasNext(); ) {
      results.add(input.next());
    }
    assertEquals(bindings.length, results.size());
    for (int i = 0; i < bindings.length; i++) {
      Binding b1 = bindings[i];
      Binding b2 = results.get(i);
      assertTrue("Bindings do not match: expected=" + b1 + " got=" + b2, equalBindings(b1, b2));
    }
  }