Blame src/terminal-regex.c

Packit Service 3bdf47
/*
Packit Service 3bdf47
 * Copyright © 2015 Egmont Koblinger
Packit Service 3bdf47
 *
Packit Service 3bdf47
 * This program is free software: you can redistribute it and/or modify
Packit Service 3bdf47
 * it under the terms of the GNU General Public License as published by
Packit Service 3bdf47
 * the Free Software Foundation, either version 3 of the License, or
Packit Service 3bdf47
 * (at your option) any later version.
Packit Service 3bdf47
 *
Packit Service 3bdf47
 * This program is distributed in the hope that it will be useful,
Packit Service 3bdf47
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 3bdf47
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 3bdf47
 * GNU General Public License for more details.
Packit Service 3bdf47
 *
Packit Service 3bdf47
 * You should have received a copy of the GNU General Public License
Packit Service 3bdf47
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service 3bdf47
 */
Packit Service 3bdf47
Packit Service 3bdf47
#include "config.h"
Packit Service 3bdf47
Packit Service 3bdf47
#include <glib.h>
Packit Service 3bdf47
#include <stdio.h>
Packit Service 3bdf47
Packit Service 3bdf47
#include "terminal-regex.h"
Packit Service 3bdf47
Packit Service 3bdf47
#ifdef TERMINAL_REGEX_MAIN
Packit Service 3bdf47
Packit Service 3bdf47
/* Shorthand for expecting the pattern to match the entire input string */
Packit Service 3bdf47
#define ENTIRE ((char *) 1)
Packit Service 3bdf47
Packit Service 3bdf47
static char*
Packit Service 3bdf47
get_match (const char *pattern, const char *string, GRegexMatchFlags match_flags)
Packit Service 3bdf47
{
Packit Service 3bdf47
  GRegex *regex;
Packit Service 3bdf47
  GMatchInfo *match_info;
Packit Service 3bdf47
  gchar *match;
Packit Service 3bdf47
Packit Service 3bdf47
  regex = g_regex_new (pattern, 0, 0, NULL);
Packit Service 3bdf47
  g_regex_match (regex, string, match_flags, &match_info);
Packit Service 3bdf47
  match = g_match_info_fetch (match_info, 0);
Packit Service 3bdf47
Packit Service 3bdf47
  g_free (regex);
Packit Service 3bdf47
  g_free (match_info);
Packit Service 3bdf47
  return match;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
/* Macros rather than functions to report useful line numbers on failure. */
Packit Service 3bdf47
#define assert_match(__pattern, __string, __expected) do { \
Packit Service 3bdf47
  gchar *__actual_match = get_match(__pattern, __string, 0); \
Packit Service 3bdf47
  const gchar *__expected_match = __expected; \
Packit Service 3bdf47
  if (__expected_match == ENTIRE) __expected_match = __string; \
Packit Service 3bdf47
  g_assert_cmpstr(__actual_match, ==, __expected_match); \
Packit Service 3bdf47
  g_free (__actual_match); \
Packit Service 3bdf47
} while (0)
Packit Service 3bdf47
Packit Service 3bdf47
#define assert_match_anchored(__pattern, __string, __expected) do { \
Packit Service 3bdf47
  gchar *__actual_match = get_match(__pattern, __string, G_REGEX_MATCH_ANCHORED); \
Packit Service 3bdf47
  const gchar *__expected_match = __expected; \
Packit Service 3bdf47
  if (__expected_match == ENTIRE) __expected_match = __string; \
Packit Service 3bdf47
  g_assert_cmpstr(__actual_match, ==, __expected_match); \
Packit Service 3bdf47
  g_free (__actual_match); \
Packit Service 3bdf47
} while (0)
Packit Service 3bdf47
Packit Service 3bdf47
int
Packit Service 3bdf47
main (int argc, char **argv)
Packit Service 3bdf47
{
Packit Service 3bdf47
  /* SCHEME is case insensitive */
Packit Service 3bdf47
  assert_match_anchored (SCHEME, "http",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (SCHEME, "HTTPS", ENTIRE);
Packit Service 3bdf47
Packit Service 3bdf47
  /* USER is nonempty, alphanumeric, dot, plus and dash */
Packit Service 3bdf47
  assert_match_anchored (USER, "",              NULL);
Packit Service 3bdf47
  assert_match_anchored (USER, "dr.john-smith", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (USER, "abc+def@ghi",   "abc+def");
Packit Service 3bdf47
Packit Service 3bdf47
  /* PASS is optional colon-prefixed value, allowing quite some characters, but definitely not @ */
Packit Service 3bdf47
  assert_match_anchored (PASS, "",          ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (PASS, "nocolon",   "");
Packit Service 3bdf47
  assert_match_anchored (PASS, ":s3cr3T",   ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (PASS, ":$?#@host", ":$?#");
Packit Service 3bdf47
Packit Service 3bdf47
  /* Hostname of at least 1 component, containing at least one non-digit in at least one of the segments */
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME1, "example.com",       ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME1, "a-b.c-d",           ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME1, "a_b",               "a");    /* TODO: can/should we totally abort here? */
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME1, "déjà-vu.com",       ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME1, "➡.ws",              ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME1, "cömbining-áccents", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME1, "12",                NULL);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME1, "12.34",             NULL);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME1, "12.ab",             ENTIRE);
Packit Service 3bdf47
//  assert_match_anchored (HOSTNAME1, "ab.12",             NULL);  /* errr... could we fail here?? */
Packit Service 3bdf47
Packit Service 3bdf47
  /* Hostname of at least 2 components, containing at least one non-digit in at least one of the segments */
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME2, "example.com",       ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME2, "example",           NULL);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME2, "12",                NULL);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME2, "12.34",             NULL);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME2, "12.ab",             ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (HOSTNAME2, "ab.12",             NULL);
Packit Service 3bdf47
//  assert_match_anchored (HOSTNAME2, "ab.cd.12",          NULL);  /* errr... could we fail here?? */
Packit Service 3bdf47
Packit Service 3bdf47
  /* IPv4 segment (number between 0 and 255) */
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "0",    ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "1",    ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "9",    ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "10",   ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "99",   ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "100",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "200",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "250",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "255",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "256",  NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "260",  NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "300",  NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "1000", NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "",     NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&S4)", "a1b",  NULL);
Packit Service 3bdf47
Packit Service 3bdf47
  /* IPv4 addresses */
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV4)", "11.22.33.44",    ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV4)", "0.1.254.255",    ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV4)", "75.150.225.300", NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV4)", "1.2.3.4.5",      "1.2.3.4");  /* we could also bail out and not match at all */
Packit Service 3bdf47
Packit Service 3bdf47
  /* IPv6 addresses */
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:::22",                           NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22::33:44::55:66",               NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "dead::beef",                        ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "faded::bee",                        NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "live::pork",                        NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "::1",                               ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11::22:33::44",                     NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:::33",                        NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "dead:beef::192.168.1.1",            ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "192.168.1.1",                       NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55:66:77:87654",        NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22::33:45678",                   NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55:66:192.168.1.12345", NULL);
Packit Service 3bdf47
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55:66:77",              NULL);   /* no :: */
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55:66:77:88",           ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55:66:77:88:99",        NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "::11:22:33:44:55:66:77",            ENTIRE); /* :: at the start */
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "::11:22:33:44:55:66:77:88",         NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33::44:55:66:77",             ENTIRE); /* :: in the middle */
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33::44:55:66:77:88",          NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55:66:77::",            ENTIRE); /* :: at the end */
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55:66:77:88::",         NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "::",                                ENTIRE); /* :: only */
Packit Service 3bdf47
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55:192.168.1.1",        NULL);   /* no :: */
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55:66:192.168.1.1",     ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55:66:77:192.168.1.1",  NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "::11:22:33:44:55:192.168.1.1",      ENTIRE); /* :: at the start */
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "::11:22:33:44:55:66:192.168.1.1",   NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33::44:55:192.168.1.1",       ENTIRE); /* :: in the imddle */
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33::44:55:66:192.168.1.1",    NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55::192.168.1.1",       ENTIRE); /* :: at the end(ish) */
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "11:22:33:44:55:66::192.168.1.1",    NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS "(?&IPV6)", "::192.168.1.1",                     ENTIRE); /* :: only(ish) */
Packit Service 3bdf47
Packit Service 3bdf47
  /* URL_HOST is either a hostname, or an IPv4 address, or a bracket-enclosed IPv6 address */
Packit Service 3bdf47
  assert_match_anchored (DEFS URL_HOST, "example",       ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URL_HOST, "example.com",   ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URL_HOST, "11.22.33.44",   ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URL_HOST, "[11.22.33.44]", NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS URL_HOST, "dead::be:ef",   "dead");  /* TODO: can/should we totally abort here? */
Packit Service 3bdf47
  assert_match_anchored (DEFS URL_HOST, "[dead::be:ef]", ENTIRE);
Packit Service 3bdf47
Packit Service 3bdf47
  /* EMAIL_HOST is either an at least two-component hostname, or a bracket-enclosed IPv[46] address */
Packit Service 3bdf47
  assert_match_anchored (DEFS EMAIL_HOST, "example",        NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS EMAIL_HOST, "example.com",    ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS EMAIL_HOST, "11.22.33.44",    NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS EMAIL_HOST, "[11.22.33.44]",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS EMAIL_HOST, "[11.22.33.456]", NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS EMAIL_HOST, "dead::be:ef",    NULL);
Packit Service 3bdf47
  assert_match_anchored (DEFS EMAIL_HOST, "[dead::be:ef]",  ENTIRE);
Packit Service 3bdf47
Packit Service 3bdf47
  /* Number between 1 and 65535 (helper for port) */
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "0",      NULL);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "1",      ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "10",     ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "100",    ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "1000",   ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "10000",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "60000",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "65000",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "65500",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "65530",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "65535",  ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "65536",  NULL);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "65540",  NULL);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "65600",  NULL);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "66000",  NULL);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "70000",  NULL);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "100000", NULL);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "",       NULL);
Packit Service 3bdf47
  assert_match_anchored (N_1_65535, "a1b",    NULL);
Packit Service 3bdf47
Packit Service 3bdf47
  /* PORT is an optional colon-prefixed value */
Packit Service 3bdf47
  assert_match_anchored (PORT, "",       ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (PORT, ":1",     ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (PORT, ":65535", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (PORT, ":65536", "");     /* TODO: can/should we totally abort here? */
Packit Service 3bdf47
Packit Service 3bdf47
  /* Parentheses are only allowed in matching pairs, see bug 763980. */
Packit Service 3bdf47
  /* TODO: add tests for PATHCHARS and PATHNONTERM; and/or URLPATH */
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/ab/cd",       ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/ab/cd.html.", "/ab/cd.html");
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/The_Offspring_(album)", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/The_Offspring)", "/The_Offspring");
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/a((b(c)d)e(f))", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/a((b(c)d)e(f)))", "/a((b(c)d)e(f))");
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/a(b).(c).", "/a(b).(c)");
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/a.(b.(c.).).(d.(e.).).)", "/a.(b.(c.).).(d.(e.).)");
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/a)b(c", "/a");
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/.", "/");
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/(.", "/");
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/).", "/");
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/().", "/()");
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/php?param[]=value1&param[]=value2", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/foo?param1[index1]=value1&param2[index2]=value2", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/[[[]][]]", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/[([])]([()])", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/([()])[([])]", ENTIRE);
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/[(])", "/");
Packit Service 3bdf47
  assert_match_anchored (DEFS URLPATH, "/([)]", "/");
Packit Service 3bdf47
Packit Service 3bdf47
Packit Service 3bdf47
  /* Put the components together and test the big picture */
Packit Service 3bdf47
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "There's no URL here http:/foo",               NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "Visit http://example.com for details",        "http://example.com");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "Trailing dot http://foo/bar.html.",           "http://foo/bar.html");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "Trailing ellipsis http://foo/bar.html...",    "http://foo/bar.html");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "Trailing comma http://foo/bar,baz,",          "http://foo/bar,baz");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "Trailing semicolon http://foo/bar;baz;",      "http://foo/bar;baz");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "See <http://foo/bar>",                        "http://foo/bar");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "<http://foo.bar/asdf.qwer.html>",             "http://foo.bar/asdf.qwer.html");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "Go to http://192.168.1.1.",                   "http://192.168.1.1");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "If not, see <http://www.gnu.org/licenses/>.", "http://www.gnu.org/licenses/");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "foo",          "http://foo/bar");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "foo",            "http://foo/bar");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "<url>http://foo/bar</url>",                   "http://foo/bar");
Packit Service 3bdf47
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://",          NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://a",         ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://aa.",       "http://aa");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://aa.b",      ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://aa.bb",     ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://aa.bb/c",   ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://aa.bb/cc",  ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://aa.bb/cc/", ENTIRE);
Packit Service 3bdf47
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "HtTp://déjà-vu.com:10000/déjà/vu", ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "HTTP://joe:sEcReT@➡.ws:1080",      ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "https://cömbining-áccents",        ENTIRE);
Packit Service 3bdf47
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://111.222.33.44",                ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://111.222.33.44/",               ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://111.222.33.44/foo",            ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://1.2.3.4:5555/xyz",             ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "https://[dead::beef]:12345/ipv6",     ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "https://[dead::beef:11.22.33.44]",    ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://1.2.3.4:",                     "http://1.2.3.4");  /* TODO: can/should we totally abort here? */
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "https://dead::beef/no-brackets-ipv6", "https://dead");    /* ditto */
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://111.222.333.444/",             NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://1.2.3.4:70000",                "http://1.2.3.4");  /* TODO: can/should we totally abort here? */
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://[dead::beef:111.222.333.444]", NULL);
Packit Service 3bdf47
Packit Service 3bdf47
  /* Username, password */
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://joe@example.com",                 ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://user.name:sec.ret@host.name",     ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://joe:secret@[::1]",                ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://dudewithnopassword:@example.com", ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://safeguy:!#$%^&*@host",            ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://invalidusername!@host",           "http://invalidusername");
Packit Service 3bdf47
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://ab.cd/ef?g=h&i=j|k=l#m=n:o=p", ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http:///foo",                         NULL);
Packit Service 3bdf47
Packit Service 3bdf47
  /* Parentheses are only allowed in matching pairs, see bug 763980. */
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "https://en.wikipedia.org/wiki/The_Offspring_(album)", ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "[markdown](https://en.wikipedia.org/wiki/The_Offspring)", "https://en.wikipedia.org/wiki/The_Offspring");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "[markdown](https://en.wikipedia.org/wiki/The_Offspring_(album))", "https://en.wikipedia.org/wiki/The_Offspring_(album)");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "[markdown](http://foo.bar/(a(b)c)d)e)f", "http://foo.bar/(a(b)c)d");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "[markdown](http://foo.bar/a)b(c", "http://foo.bar/a");
Packit Service 3bdf47
Packit Service 3bdf47
  /* Apostrophes are allowed, except at trailing position if the URL is preceded by an apostrophe, see bug 448044. */
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "https://en.wikipedia.org/wiki/Moore's_law", ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "", "https://en.wikipedia.org/wiki/Moore's_law");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "https://en.wikipedia.org/wiki/Cryin'", ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "", "https://en.wikipedia.org/wiki/Cryin'");
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "", "https://en.wikipedia.org/wiki/Aerosmith");
Packit Service 3bdf47
Packit Service 3bdf47
  /* No scheme */
Packit Service 3bdf47
  assert_match (REGEX_URL_HTTP, "www.foo.bar/baz",     ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_HTTP, "WWW3.foo.bar/baz",    ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_HTTP, "FTP.FOO.BAR/BAZ",     ENTIRE);  /* FIXME if no scheme is given and url starts with ftp, can we make the protocol ftp instead of http? */
Packit Service 3bdf47
  assert_match (REGEX_URL_HTTP, "ftpxy.foo.bar/baz",   ENTIRE);
Packit Service 3bdf47
//  assert_match (REGEX_URL_HTTP, "ftp.123/baz",         NULL);  /* errr... could we fail here?? */
Packit Service 3bdf47
  assert_match (REGEX_URL_HTTP, "foo.bar/baz",         NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_HTTP, "abc.www.foo.bar/baz", NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_HTTP, "uvwww.foo.bar/baz",   NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_HTTP, "xftp.foo.bar/baz",    NULL);
Packit Service 3bdf47
Packit Service 3bdf47
  /* file:/ or file://(hostname)?/ */
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "file:",                NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "file:/",               ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "file://",              NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "file:///",             ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "file:////",            NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "file:etc/passwd",      NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "File:/etc/passwd",     ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "FILE:///etc/passwd",   ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "file:////etc/passwd",  NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "file://host.name",     NULL);
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "file://host.name/",    ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "file://host.name/etc", ENTIRE);
Packit Service 3bdf47
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "See file:/.",             "file:/");
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "See file:///.",           "file:///");
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "See file:/lost+found.",   "file:/lost+found");
Packit Service 3bdf47
  assert_match (REGEX_URL_FILE, "See file:///lost+found.", "file:///lost+found");
Packit Service 3bdf47
Packit Service 3bdf47
  /* Email */
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to foo@bar.com.",        "foo@bar.com");
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to <foo@bar.com>",       "foo@bar.com");
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to mailto:foo@bar.com.", "mailto:foo@bar.com");
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to MAILTO:FOO@BAR.COM.", "MAILTO:FOO@BAR.COM");
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to foo@[1.2.3.4]",       "foo@[1.2.3.4]");
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to foo@[1.2.3.456]",     NULL);
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to foo@[1::2345]",       "foo@[1::2345]");
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to foo@[dead::beef]",    "foo@[dead::beef]");
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to foo@1.2.3.4",         NULL);
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to foo@1.2.3.456",       NULL);
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to foo@1::2345",         NULL);
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "Write to foo@dead::beef",      NULL);
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "<baz email=\"foo@bar.com\"/>", "foo@bar.com");
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "<baz email='foo@bar.com'/>",   "foo@bar.com");
Packit Service 3bdf47
  assert_match (REGEX_EMAIL, "<email>foo@bar.com</email>",   "foo@bar.com");
Packit Service 3bdf47
Packit Service 3bdf47
  /* Sip, examples from rfc 3261 */
Packit Service 3bdf47
  assert_match (REGEX_URL_VOIP, "sip:alice@atlanta.com;maddr=239.255.255.1;ttl=15",           ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_VOIP, "sip:alice@atlanta.com",                                      ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_VOIP, "sip:alice:secretword@atlanta.com;transport=tcp",             ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_VOIP, "sips:alice@atlanta.com?subject=project%20x&priority=urgent", ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_VOIP, "sip:+1-212-555-1212:1234@gateway.com;user=phone",            ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_VOIP, "sips:1212@gateway.com",                                      ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_VOIP, "sip:alice@192.0.2.4",                                        ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_VOIP, "sip:atlanta.com;method=REGISTER?to=alice%40atlanta.com",     ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_VOIP, "SIP:alice;day=tuesday@atlanta.com",                          ENTIRE);
Packit Service 3bdf47
  assert_match (REGEX_URL_VOIP, "Dial sip:alice@192.0.2.4.",                                  "sip:alice@192.0.2.4");
Packit Service 3bdf47
Packit Service 3bdf47
  /* Extremely long match, bug 770147 */
Packit Service 3bdf47
  assert_match (REGEX_URL_AS_IS, "http://www.example.com/ThisPathConsistsOfMoreThan1024Characters"
Packit Service 3bdf47
                                 "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Packit Service 3bdf47
                                 "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Packit Service 3bdf47
                                 "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Packit Service 3bdf47
                                 "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Packit Service 3bdf47
                                 "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Packit Service 3bdf47
                                 "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Packit Service 3bdf47
                                 "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Packit Service 3bdf47
                                 "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Packit Service 3bdf47
                                 "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
Packit Service 3bdf47
                                 "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", ENTIRE);
Packit Service 3bdf47
Packit Service 3bdf47
  printf("terminal-regex tests passed :)\n");
Packit Service 3bdf47
  return 0;
Packit Service 3bdf47
}
Packit Service 3bdf47
Packit Service 3bdf47
#endif /* TERMINAL_REGEX_MAIN */