mirror of
https://github.com/tc39/test262.git
synced 2025-07-22 13:34:38 +02:00
Generate test files from templates
This commit is contained in:
parent
10a8c0420e
commit
6a18c27ca1
@ -170,14 +170,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -173,14 +173,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
@ -170,14 +170,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -173,14 +173,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
@ -177,14 +177,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -180,14 +180,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
@ -177,14 +177,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -180,14 +180,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
@ -182,14 +182,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -185,14 +185,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
@ -185,14 +185,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -188,14 +188,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
@ -170,14 +170,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -173,14 +173,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
@ -170,14 +170,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -173,14 +173,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
@ -177,14 +177,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -180,14 +180,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
@ -177,14 +177,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -180,14 +180,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
@ -182,14 +182,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -185,14 +185,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
@ -185,14 +185,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.return("return-arg-2").then(v => {
|
||||
iter.return().then(v => {
|
||||
assert.sameValue(log[6].name, "get return");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get return thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call return");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "get return thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "return args.length");
|
||||
assert.sameValue(log[7].args[0], "return-arg-2", "return args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "return args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get return done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "return-result-2", "get return done thisValue");
|
||||
|
@ -188,14 +188,14 @@ iter.next().then(v => {
|
||||
|
||||
assert.sameValue(log.length, 6, "log.length");
|
||||
|
||||
iter.throw("throw-arg-2").then(v => {
|
||||
iter.throw().then(v => {
|
||||
assert.sameValue(log[6].name, "get throw");
|
||||
assert.sameValue(log[6].thisValue.name, "syncIterator", "get throw thisValue");
|
||||
|
||||
assert.sameValue(log[7].name, "call throw");
|
||||
assert.sameValue(log[7].thisValue.name, "syncIterator", "throw thisValue");
|
||||
assert.sameValue(log[7].args.length, 1, "throw args.length");
|
||||
assert.sameValue(log[7].args[0], "throw-arg-2", "throw args[0]");
|
||||
assert.sameValue(log[7].args[0], undefined, "throw args[0]");
|
||||
|
||||
assert.sameValue(log[8].name, "get throw done (2)");
|
||||
assert.sameValue(log[8].thisValue.name, "throw-result-2", "get throw done thisValue");
|
||||
|
Loading…
x
Reference in New Issue
Block a user