void test(const char *name, css_node_t *style, css_node_t *expected_layout) {
  layoutNode(style, CSS_UNDEFINED);

  if (!are_layout_equal(style, expected_layout)) {
    printf("%sF%s", "\x1B[31m", "\x1B[0m");
    add_failed_test(name, style, expected_layout);
  } else {
    printf("%s.%s", "\x1B[32m", "\x1B[0m");
    free_css_node(style);
    free_css_node(expected_layout);
  }
}
static bool are_layout_equal(css_node_t *a, css_node_t *b) {
  if (!eq(a->layout.dimensions[CSS_WIDTH], b->layout.dimensions[CSS_WIDTH]) ||
      !eq(a->layout.dimensions[CSS_HEIGHT], b->layout.dimensions[CSS_HEIGHT]) ||
      !eq(a->layout.position[CSS_TOP], b->layout.position[CSS_TOP]) ||
      !eq(a->layout.position[CSS_LEFT], b->layout.position[CSS_LEFT]) ||
      !eq(a->children_count, b->children_count)) {
    return false;
  }
  for (int i = 0; i < a->children_count; ++i) {
    if (!are_layout_equal(a->get_child(a->context, i), b->get_child(b->context, i))) {
      return false;
    }
  }
  return true;
}
bool test(css_node_t *style, css_node_t *expected_layout) {
  layoutNode(style, CSS_UNDEFINED, CSS_UNDEFINED, (css_direction_t)-1);
  return are_layout_equal(style, expected_layout);
}