--- /dev/null
+/******************************************************************************
+ * Copyright (c) 2000-2016 Ericsson Telecom AB
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Baranyi, Botond – initial implementation
+ *
+ ******************************************************************************/
+module TtemplateUnicharstr {
+
+type component templateUnicharstr_mycomp {};
+type record templateUnicharstr_rec {
+ universal charstring x1,
+ universal charstring x2,
+ universal charstring x3 optional
+}
+with {
+ encode "JSON";
+ variant(x1) "JSON: name as first";
+ variant(x2) "JSON: name as second";
+ variant(x3) "JSON: name as third";
+}
+
+type record decmatch_rec {
+ integer i,
+ charstring s
+}
+with {
+ encode "JSON";
+}
+
+type record of integer decmatch_list
+with {
+ encode "XML";
+ variant "list";
+}
+
+type union decmatch_uni {
+ integer i,
+ charstring s
+}
+with {
+ encode "RAW";
+ variant(i) "FIELDLENGTH(16)";
+}
+
+type octetstring OS
+with {
+ encode "RAW";
+}
+
+
+template decmatch_uni decmatch_tUnion := { i := ? };
+
+template decmatch_rec decmatch_tRecord := { i := (0..infinity), s := ? };
+
+template templateUnicharstr_rec templateUnicharstr_tDecmatch := { // decoded content match
+ x1 := decmatch decmatch_list: { (1..10), (11..20), (21..30) }, // no format parameter = UTF-8
+ x2 := decmatch decmatch_tUnion,
+ x3 := decmatch modifies decmatch_tRecord := { s := "abc" }
+};
+
+template templateUnicharstr_rec templateUnicharstr_tDecmatchSelfRef := { // decoded content match with self-reference
+ x1 := "a",
+ x2 := decmatch("UTF-8") templateUnicharstr_tDecmatchSelfRef.x1,
+ x3 := decmatch("UTF-8") templateUnicharstr_rec: { x1 := templateUnicharstr_tDecmatchSelfRef.x1, x2 := ?, x3 := * }
+};
+
+template templateUnicharstr_rec templateUnicharstr_tDecmatch16 := { // decoded content match in UTF-16 format
+ x1 := decmatch("UTF-16") OS: 'FEFF'O, // just the BOM
+ x2 := decmatch("UTF-16LE") OS: ? length (4..6), // BOM + 1-2 characters below FFFF or 1 character above FFFF
+ x3 := decmatch("UTF-16BE") OS: ? length (8..infinity) // BOM + 3 or more characters (2 or more if one of them is above FFFF)
+};
+
+template templateUnicharstr_rec templateUnicharstr_tDecmatch32 := { // decoded content match in UTF-32 format
+ x1 := decmatch("UTF-32") OS: '0000FEFF'O, // just the BOM
+ x2 := decmatch("UTF-32LE") OS: ? length (4..8), // BOM + 1 optional character
+ x3 := decmatch("UTF-32BE") OS: ? length (16..infinity) // BOM + 3 or more characters
+};
+
+template charstring templateUnicharstr_tCharDecmatch := decmatch decmatch_rec: { i := 1, s := ? };
+
+
+testcase templateUnicharstrDecmatch() runs on templateUnicharstr_mycomp {
+ var decmatch_rec bad_rec, good_rec;
+ bad_rec := { i := 11, s := "xyz" };
+ good_rec := { i := 3, s := "abc" };
+ var decmatch_list bad_list, good_list;
+ bad_list := { 4, 7, 10 };
+ good_list := { 2, 15, 28 };
+ var decmatch_uni bad_uni, good_uni;
+ bad_uni := { s := "five" };
+ good_uni := { i := 5 };
+ var universal charstring bad_rec_enc, good_rec_enc, bad_list_enc, good_list_enc, bad_uni_enc, good_uni_enc;
+ bad_rec_enc := oct2unichar(bit2oct(encvalue(bad_rec)), "UTF-8");
+ good_rec_enc := oct2unichar(bit2oct(encvalue(good_rec)), "UTF-8");
+ bad_list_enc := oct2unichar(bit2oct(encvalue(bad_list)), "UTF-8");
+ good_list_enc := oct2unichar(bit2oct(encvalue(good_list)), "UTF-8");
+ bad_uni_enc := oct2unichar(bit2oct(encvalue(bad_uni)), "UTF-8");
+ good_uni_enc := oct2unichar(bit2oct(encvalue(good_uni)), "UTF-8");
+ var templateUnicharstr_rec r1, r2, r3, r4, r5;
+ r1 := { x1 := good_list_enc, x2 := good_uni_enc, x3 := good_rec_enc };
+ r2 := { x1 := bad_list_enc, x2 := good_uni_enc, x3 := good_rec_enc };
+ r3 := { x1 := good_list_enc, x2 := bad_uni_enc, x3 := good_rec_enc };
+ r4 := { x1 := good_list_enc, x2 := good_uni_enc, x3 := bad_rec_enc };
+ r5 := { x1 := good_list_enc, x2 := good_uni_enc, x3 := "xyz" };
+ // match: all 3 are good
+ if (match(r1, templateUnicharstr_tDecmatch)) { setverdict(pass); }
+ else { setverdict(fail, 1); }
+ // no match: decoded list does not match
+ if (not match(r2, templateUnicharstr_tDecmatch)) { setverdict(pass); }
+ else { setverdict(fail, 2); }
+ // no match: decoded union does not match
+ if (not match(r3, templateUnicharstr_tDecmatch)) { setverdict(pass); }
+ else { setverdict(fail, 3); }
+ // no match: decoded record does not match
+ if (not match(r4, templateUnicharstr_tDecmatch)) { setverdict(pass); }
+ else { setverdict(fail, 4); }
+ // no match: x3 is not a valid encoded record value
+ if (not match(r5, templateUnicharstr_tDecmatch)) { setverdict(pass); }
+ else { setverdict(fail, 5); }
+ // match r1 with the same template declared as an in-line template
+ if (match(r1, templateUnicharstr_rec: {
+ x1 := decmatch decmatch_list: { (1..10), (11..20), (21..30) },
+ x2 := decmatch decmatch_tUnion,
+ x3 := decmatch modifies decmatch_tRecord := { s := "abc" }
+ })) { setverdict(pass); }
+ else { setverdict(fail, 6); }
+}
+
+external function ef_enc_rec_x1(in templateUnicharstr_rec.x1 x) return octetstring
+with { extension "prototype(convert) encode(JSON)" }
+
+testcase templateUnicharstrDecmatchSelfRef() runs on templateUnicharstr_mycomp {
+ // global self-referencing template
+ var templateUnicharstr_rec.x1 bad_ucs, good_ucs;
+ bad_ucs := char(0, 0, 1, 113);
+ good_ucs := "a";
+ var templateUnicharstr_rec bad_rec, good_rec;
+ bad_rec := { x1 := char(0, 0, 0, 255), x2 := char(0, 0, 1, 0), x3 := char(0, 0, 1, 1) };
+ good_rec := { x1 := "a", x2 := char(0, 0, 1, 0), x3 := char(0, 0, 1, 1) };
+ var universal charstring bad_ucs_enc, good_ucs_enc, bad_rec_enc, good_rec_enc;
+ bad_ucs_enc := oct2unichar(ef_enc_rec_x1(bad_ucs), "UTF-8");
+ good_ucs_enc := oct2unichar(ef_enc_rec_x1(good_ucs), "UTF-8");
+ bad_rec_enc := oct2unichar(bit2oct(encvalue(bad_rec)), "UTF-8");
+ good_rec_enc := oct2unichar(bit2oct(encvalue(good_rec)), "UTF-8");
+ var templateUnicharstr_rec r1, r2, r3;
+ r1 := { x1 := "a", x2 := good_ucs_enc, x3 := good_rec_enc };
+ r2 := { x1 := "a", x2 := bad_ucs_enc, x3 := good_rec_enc };
+ r3 := { x1 := "a", x2 := good_ucs_enc, x3 := bad_rec_enc };
+ // match: all 2 are good
+ if (match(r1, templateUnicharstr_tDecmatchSelfRef)) { setverdict(pass); }
+ else { setverdict(fail, 1); }
+ // no match: decoded octetstring does not match
+ if (not match(r2, templateUnicharstr_tDecmatchSelfRef)) { setverdict(pass); }
+ else { setverdict(fail, 2); }
+ // no match: decoded record does not match
+ if (not match(r3, templateUnicharstr_tDecmatchSelfRef)) { setverdict(pass); }
+ else { setverdict(fail, 3); }
+
+ // local self-referencing template
+ var template templateUnicharstr_rec t := { x1 := "a", x2 := ?, x3 := ? };
+ t.x1 := decmatch t;
+ var templateUnicharstr_rec r4, r5;
+ r4 := { x1 := good_rec_enc, x2 := "x", x3 := "y" };
+ r5 := { x1 := bad_rec_enc, x2 := "x", x3 := "y" };
+ if (match(r4, t)) { setverdict(pass); }
+ else { setverdict(fail, 4); }
+ if (not match(r5, t)) { setverdict(pass); }
+ else { setverdict(fail, 5); }
+}
+
+testcase templateUnicharstrDecmatch16() runs on templateUnicharstr_mycomp {
+ var universal charstring bad16, good16, bad16le, good16le, bad16be, good16be;
+ bad16 := "abc";
+ good16 := "";
+ bad16le := char(0, 1, 2, 3) & char(0, 4, 5, 6);
+ good16le := char(0, 1, 2, 3);
+ bad16be := char(0, 1, 10, 100);
+ good16be := "ab" & char(0, 1, 10, 100) & "xy";
+ var templateUnicharstr_rec r1, r2, r3, r4;
+ r1 := { x1 := good16, x2 := good16le, x3 := good16be };
+ r2 := { x1 := bad16, x2 := good16le, x3 := good16be };
+ r3 := { x1 := good16, x2 := bad16le, x3 := good16be };
+ r4 := { x1 := good16, x2 := good16le, x3 := bad16be };
+ // match: all 3 are good
+ if (match(r1, templateUnicharstr_tDecmatch16)) { setverdict(pass); }
+ else { setverdict(fail, 1); }
+ // no match: decoded string in UTF-16 format is not empty
+ if (not match(r2, templateUnicharstr_tDecmatch16)) { setverdict(pass); }
+ else { setverdict(fail, 2); }
+ // no match: decoded string in UTF-16LE format is too long
+ if (not match(r3, templateUnicharstr_tDecmatch16)) { setverdict(pass); }
+ else { setverdict(fail, 3); }
+ // no match: decoded string in UTF-16BE format is too short
+ if (not match(r4, templateUnicharstr_tDecmatch16)) { setverdict(pass); }
+ else { setverdict(fail, 4); }
+}
+
+testcase templateUnicharstrDecmatch32() runs on templateUnicharstr_mycomp {
+ var universal charstring bad32, good32, bad32le, good32le, bad32be, good32be;
+ bad32 := "abc";
+ good32 := "";
+ bad32le := char(0, 1, 2, 3) & char(0, 4, 5, 6);
+ good32le := char(0, 1, 2, 3);
+ bad32be := char(0, 1, 10, 100);
+ good32be := "ab" & char(0, 1, 10, 100) & "xy";
+ var templateUnicharstr_rec r1, r2, r3, r4;
+ r1 := { x1 := good32, x2 := good32le, x3 := good32be };
+ r2 := { x1 := bad32, x2 := good32le, x3 := good32be };
+ r3 := { x1 := good32, x2 := bad32le, x3 := good32be };
+ r4 := { x1 := good32, x2 := good32le, x3 := bad32be };
+ // match: all 3 are good
+ if (match(r1, templateUnicharstr_tDecmatch32)) { setverdict(pass); }
+ else { setverdict(fail, 1); }
+ // no match: decoded string in UTF-32 format is not empty
+ if (not match(r2, templateUnicharstr_tDecmatch32)) { setverdict(pass); }
+ else { setverdict(fail, 2); }
+ // no match: decoded string in UTF-32LE format is too long
+ if (not match(r3, templateUnicharstr_tDecmatch32)) { setverdict(pass); }
+ else { setverdict(fail, 3); }
+ // no match: decoded string in UTF-32BE format is too short
+ if (not match(r4, templateUnicharstr_tDecmatch32)) { setverdict(pass); }
+ else { setverdict(fail, 4); }
+}
+
+testcase templateUnicharstrDecmatchCopyCharstr() runs on templateUnicharstr_mycomp {
+ // testing a universal charstring template copied from a
+ // charstring template (with decoded content matching)
+ var template universal charstring t := templateUnicharstr_tCharDecmatch;
+ var decmatch_rec bad_rec, good_rec;
+ bad_rec := { i := 6, s := "xyz" };
+ good_rec := { i := 1, s := "abc" };
+ var universal charstring bad_rec_enc, good_rec_enc;
+ bad_rec_enc := oct2unichar(bit2oct(encvalue(bad_rec)), "UTF-8");
+ good_rec_enc := oct2unichar(bit2oct(encvalue(good_rec)), "UTF-8");
+ if (match(good_rec_enc, t)) { setverdict(pass); }
+ else { setverdict(fail, 1); }
+ if (not match(bad_rec_enc, t)) { setverdict(pass); }
+ else { setverdict(fail, 2); }
+}
+
+control {
+ execute(templateUnicharstrDecmatch());
+ execute(templateUnicharstrDecmatchSelfRef());
+ execute(templateUnicharstrDecmatch16());
+ execute(templateUnicharstrDecmatch32());
+ execute(templateUnicharstrDecmatchCopyCharstr());
+}
+
+}