aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/test_util_jid.lua70
-rw-r--r--util/jid.lua15
2 files changed, 85 insertions, 0 deletions
diff --git a/tests/test_util_jid.lua b/tests/test_util_jid.lua
index 02a90c3b..c697e63f 100644
--- a/tests/test_util_jid.lua
+++ b/tests/test_util_jid.lua
@@ -71,3 +71,73 @@ function compare(compare)
assert_equal(compare("user@other-host", "host"), false, "host should not match");
assert_equal(compare("user@other-host", "user@host"), false, "host should not match");
end
+
+function node(node)
+ local function test(jid, expected_node)
+ assert_equal(node(jid), expected_node, "Unexpected node for "..tostring(jid));
+ end
+
+ test("example.com", nil);
+ test("foo.example.com", nil);
+ test("foo.example.com/resource", nil);
+ test("foo.example.com/some resource", nil);
+ test("foo.example.com/some@resource", nil);
+
+ test("foo@foo.example.com/some@resource", "foo");
+ test("foo@example/some@resource", "foo");
+
+ test("foo@example/@resource", "foo");
+ test("foo@example@resource", nil);
+ test("foo@example", "foo");
+ test("foo", nil);
+
+ test(nil, nil);
+end
+
+function host(host)
+ local function test(jid, expected_host)
+ assert_equal(host(jid), expected_host, "Unexpected host for "..tostring(jid));
+ end
+
+ test("example.com", "example.com");
+ test("foo.example.com", "foo.example.com");
+ test("foo.example.com/resource", "foo.example.com");
+ test("foo.example.com/some resource", "foo.example.com");
+ test("foo.example.com/some@resource", "foo.example.com");
+
+ test("foo@foo.example.com/some@resource", "foo.example.com");
+ test("foo@example/some@resource", "example");
+
+ test("foo@example/@resource", "example");
+ test("foo@example@resource", nil);
+ test("foo@example", "example");
+ test("foo", "foo");
+
+ test(nil, nil);
+end
+
+function resource(resource)
+ local function test(jid, expected_resource)
+ assert_equal(resource(jid), expected_resource, "Unexpected resource for "..tostring(jid));
+ end
+
+ test("example.com", nil);
+ test("foo.example.com", nil);
+ test("foo.example.com/resource", "resource");
+ test("foo.example.com/some resource", "some resource");
+ test("foo.example.com/some@resource", "some@resource");
+
+ test("foo@foo.example.com/some@resource", "some@resource");
+ test("foo@example/some@resource", "some@resource");
+
+ test("foo@example/@resource", "@resource");
+ test("foo@example@resource", nil);
+ test("foo@example", nil);
+ test("foo", nil);
+ test("/foo", nil);
+ test("@x/foo", nil);
+ test("@/foo", nil);
+
+ test(nil, nil);
+end
+
diff --git a/util/jid.lua b/util/jid.lua
index 76155ac7..60bb0829 100644
--- a/util/jid.lua
+++ b/util/jid.lua
@@ -93,6 +93,18 @@ local function compare(jid, acl)
return false
end
+local function node(jid)
+ return (select(1, split(jid)));
+end
+
+local function host(jid)
+ return (select(2, split(jid)));
+end
+
+local function resource(jid)
+ return (select(3, split(jid)));
+end
+
local function escape(s) return s and (s:gsub(".", escapes)); end
local function unescape(s) return s and (s:gsub("\\%x%x", unescapes)); end
@@ -103,6 +115,9 @@ return {
join = join;
prep = prep;
compare = compare;
+ node = node;
+ host = host;
+ resource = resource;
escape = escape;
unescape = unescape;
};