protected function assertFormletsEqual(Formlet $a, Formlet $b, $value, $contains_applicable)
 {
     // Two formlets are considered equal, when their observable output
     // is equal (that is like extensional equality?)
     $ns_a = NameSource::instantiate("test");
     $ns_b = NameSource::instantiate("test");
     $ns = NameSource::instantiate("test");
     $repr_a = $a->instantiate($ns_a);
     $repr_b = $b->instantiate($ns_b);
     $name_and_ns = $ns->getNameAndNext();
     $inp = array($name_and_ns["name"] => "100");
     $val_a = $repr_a["collector"]->collect($inp);
     $val_b = $repr_b["collector"]->collect($inp);
     // This will only work if equal works as expected on the result, that
     // is the thing checked really is equality and not identity.
     if (!$contains_applicable) {
         if ($val_a->isError()) {
             print_r($val_a->toDict());
         }
         $this->assertEquals($val_a->get(), $val_b->get());
     } else {
         $this->assertEquals($val_a->apply($value)->get(), $val_b->apply($value)->get());
     }
     $dict_a = new RenderDict($inp, $val_a);
     $dict_b = new RenderDict($inp, $val_b);
     $rendered_a = $repr_a["builder"]->build()->render();
     $rendered_b = $repr_b["builder"]->build()->render();
     $this->assertEquals($rendered_a, $rendered_b);
     $rendered_a2 = $repr_a["builder"]->buildWithDict($dict_a)->render();
     $rendered_b2 = $repr_b["builder"]->buildWithDict($dict_b)->render();
     $this->assertEquals($rendered_a2, $rendered_b2);
 }