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