1'use strict'; 2 3require('../common'); 4const assert = require('assert'); 5const { MIMEType, MIMEParams } = require('util'); 6 7 8const WHITESPACES = '\t\n\f\r '; 9const NOT_HTTP_TOKEN_CODE_POINT = ','; 10const NOT_HTTP_QUOTED_STRING_CODE_POINT = '\n'; 11 12const mime = new MIMEType('application/ecmascript; '); 13const mime_descriptors = Object.getOwnPropertyDescriptors(mime); 14const mime_proto = Object.getPrototypeOf(mime); 15const mime_impersonator = Object.create(mime_proto); 16for (const key of Object.keys(mime_descriptors)) { 17 const descriptor = mime_descriptors[key]; 18 if (descriptor.get) { 19 assert.throws(descriptor.get.call(mime_impersonator), /Invalid receiver/i); 20 } 21 if (descriptor.set) { 22 assert.throws(descriptor.set.call(mime_impersonator, 'x'), /Invalid receiver/i); 23 } 24} 25 26 27assert.strictEqual( 28 JSON.stringify(mime), 29 JSON.stringify('application/ecmascript')); 30assert.strictEqual(`${mime}`, 'application/ecmascript'); 31assert.strictEqual(mime.essence, 'application/ecmascript'); 32assert.strictEqual(mime.type, 'application'); 33assert.strictEqual(mime.subtype, 'ecmascript'); 34assert.ok(mime.params); 35assert.deepStrictEqual([], [...mime.params]); 36assert.strictEqual(mime.params.has('not found'), false); 37assert.strictEqual(mime.params.get('not found'), null); 38assert.strictEqual(mime.params.delete('not found'), undefined); 39 40 41mime.type = 'text'; 42assert.strictEqual(mime.type, 'text'); 43assert.strictEqual(JSON.stringify(mime), JSON.stringify('text/ecmascript')); 44assert.strictEqual(`${mime}`, 'text/ecmascript'); 45assert.strictEqual(mime.essence, 'text/ecmascript'); 46 47assert.throws(() => { 48 mime.type = `${WHITESPACES}text`; 49}, /ERR_INVALID_MIME_SYNTAX/); 50 51assert.throws(() => mime.type = '', /type/i); 52assert.throws(() => mime.type = '/', /type/i); 53assert.throws(() => mime.type = 'x/', /type/i); 54assert.throws(() => mime.type = '/x', /type/i); 55assert.throws(() => mime.type = NOT_HTTP_TOKEN_CODE_POINT, /type/i); 56assert.throws(() => mime.type = `${NOT_HTTP_TOKEN_CODE_POINT}/`, /type/i); 57assert.throws(() => mime.type = `/${NOT_HTTP_TOKEN_CODE_POINT}`, /type/i); 58 59 60mime.subtype = 'javascript'; 61assert.strictEqual(mime.type, 'text'); 62assert.strictEqual(JSON.stringify(mime), JSON.stringify('text/javascript')); 63assert.strictEqual(`${mime}`, 'text/javascript'); 64assert.strictEqual(mime.essence, 'text/javascript'); 65assert.strictEqual(`${mime.params}`, ''); 66assert.strictEqual(`${new MIMEParams()}`, ''); 67assert.strictEqual(`${new MIMEParams(mime.params)}`, ''); 68assert.strictEqual(`${new MIMEParams(`${mime.params}`)}`, ''); 69 70assert.throws(() => { 71 mime.subtype = `javascript${WHITESPACES}`; 72}, /ERR_INVALID_MIME_SYNTAX/); 73 74assert.throws(() => mime.subtype = '', /subtype/i); 75assert.throws(() => mime.subtype = ';', /subtype/i); 76assert.throws(() => mime.subtype = 'x;', /subtype/i); 77assert.throws(() => mime.subtype = ';x', /subtype/i); 78assert.throws(() => mime.subtype = NOT_HTTP_TOKEN_CODE_POINT, /subtype/i); 79assert.throws( 80 () => mime.subtype = `${NOT_HTTP_TOKEN_CODE_POINT};`, 81 /subtype/i); 82assert.throws( 83 () => mime.subtype = `;${NOT_HTTP_TOKEN_CODE_POINT}`, 84 /subtype/i); 85 86 87const params = mime.params; 88params.set('charset', 'utf-8'); 89assert.strictEqual(params.has('charset'), true); 90assert.strictEqual(params.get('charset'), 'utf-8'); 91assert.deepStrictEqual([...params], [['charset', 'utf-8']]); 92assert.strictEqual( 93 JSON.stringify(mime), 94 JSON.stringify('text/javascript;charset=utf-8')); 95assert.strictEqual(`${mime}`, 'text/javascript;charset=utf-8'); 96assert.strictEqual(mime.essence, 'text/javascript'); 97assert.strictEqual(`${mime.params}`, 'charset=utf-8'); 98assert.strictEqual(`${new MIMEParams(mime.params)}`, ''); 99assert.strictEqual(`${new MIMEParams(`${mime.params}`)}`, ''); 100 101params.set('goal', 'module'); 102assert.strictEqual(params.has('goal'), true); 103assert.strictEqual(params.get('goal'), 'module'); 104assert.deepStrictEqual([...params], [['charset', 'utf-8'], ['goal', 'module']]); 105assert.strictEqual( 106 JSON.stringify(mime), 107 JSON.stringify('text/javascript;charset=utf-8;goal=module')); 108assert.strictEqual(`${mime}`, 'text/javascript;charset=utf-8;goal=module'); 109assert.strictEqual(mime.essence, 'text/javascript'); 110assert.strictEqual(`${mime.params}`, 'charset=utf-8;goal=module'); 111assert.strictEqual(`${new MIMEParams(mime.params)}`, ''); 112assert.strictEqual(`${new MIMEParams(`${mime.params}`)}`, ''); 113 114assert.throws(() => { 115 params.set(`${WHITESPACES}goal`, 'module'); 116}, /ERR_INVALID_MIME_SYNTAX/); 117 118params.set('charset', 'iso-8859-1'); 119assert.strictEqual(params.has('charset'), true); 120assert.strictEqual(params.get('charset'), 'iso-8859-1'); 121assert.deepStrictEqual( 122 [...params], 123 [['charset', 'iso-8859-1'], ['goal', 'module']]); 124assert.strictEqual( 125 JSON.stringify(mime), 126 JSON.stringify('text/javascript;charset=iso-8859-1;goal=module')); 127assert.strictEqual(`${mime}`, 'text/javascript;charset=iso-8859-1;goal=module'); 128assert.strictEqual(mime.essence, 'text/javascript'); 129 130params.delete('charset'); 131assert.strictEqual(params.has('charset'), false); 132assert.strictEqual(params.get('charset'), null); 133assert.deepStrictEqual([...params], [['goal', 'module']]); 134assert.strictEqual( 135 JSON.stringify(mime), 136 JSON.stringify('text/javascript;goal=module')); 137assert.strictEqual(`${mime}`, 'text/javascript;goal=module'); 138assert.strictEqual(mime.essence, 'text/javascript'); 139 140params.set('x', ''); 141assert.strictEqual(params.has('x'), true); 142assert.strictEqual(params.get('x'), ''); 143assert.deepStrictEqual([...params], [['goal', 'module'], ['x', '']]); 144assert.strictEqual( 145 JSON.stringify(mime), 146 JSON.stringify('text/javascript;goal=module;x=""')); 147assert.strictEqual(`${mime}`, 'text/javascript;goal=module;x=""'); 148assert.strictEqual(mime.essence, 'text/javascript'); 149 150assert.throws(() => params.set('', 'x'), /parameter name/i); 151assert.throws(() => params.set('=', 'x'), /parameter name/i); 152assert.throws(() => params.set('x=', 'x'), /parameter name/i); 153assert.throws(() => params.set('=x', 'x'), /parameter name/i); 154assert.throws(() => params.set(`${NOT_HTTP_TOKEN_CODE_POINT}=`, 'x'), /parameter name/i); 155assert.throws(() => params.set(`${NOT_HTTP_TOKEN_CODE_POINT}x`, 'x'), /parameter name/i); 156assert.throws(() => params.set(`x${NOT_HTTP_TOKEN_CODE_POINT}`, 'x'), /parameter name/i); 157 158assert.throws(() => params.set('x', `${NOT_HTTP_QUOTED_STRING_CODE_POINT};`), /parameter value/i); 159assert.throws(() => params.set('x', `${NOT_HTTP_QUOTED_STRING_CODE_POINT}x`), /parameter value/i); 160assert.throws(() => params.set('x', `x${NOT_HTTP_QUOTED_STRING_CODE_POINT}`), /parameter value/i); 161