+ ok1(!tal_first(ctx));
+
+ /* NULL arg with take means always fail. */
+ ok1(strreg(ctx, take(NULL), "((hello|goodbye) world)",
+ &b, NULL, invalid) == false);
+
+ /* Take string. */
+ a = tal_strdup(ctx, "hello world!");
+ ok1(strreg(ctx, take(a), "([a-z]+)", &b, invalid) == true);
+ ok1(streq(b, "hello"));
+ ok1(tal_parent(b) == ctx);
+ tal_free(b);
+ ok1(tal_first(ctx) == NULL);
+
+ /* Take regex. */
+ a = tal_strdup(ctx, "([a-z]+)");
+ ok1(strreg(ctx, "hello world!", take(a), &b, invalid) == true);
+ ok1(streq(b, "hello"));
+ ok1(tal_parent(b) == ctx);
+ tal_free(b);
+ ok1(tal_first(ctx) == NULL);
+
+ /* Take both. */
+ a = tal_strdup(ctx, "([a-z]+)");
+ ok1(strreg(ctx, take(tal_strdup(ctx, "hello world!")),
+ take(a), &b, invalid) == true);
+ ok1(streq(b, "hello"));
+ ok1(tal_parent(b) == ctx);
+ tal_free(b);
+ ok1(tal_first(ctx) == NULL);
+
+ /* ... even if we fail to match. */
+ a = tal_strdup(ctx, "([a-z]+)");
+ ok1(strreg(ctx, take(tal_strdup(ctx, "HELLO WORLD!")),
+ take(a), &b, invalid) == false);
+ ok1(tal_first(ctx) == NULL);