MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1import { test, testDeep, summary } from './helpers.js';
2
3console.log('Navigator Tests\n');
4
5test('navigator exists', typeof navigator, 'object');
6test('navigator toStringTag', Object.prototype.toString.call(navigator), '[object Navigator]');
7
8test('navigator.hardwareConcurrency exists', typeof navigator.hardwareConcurrency, 'number');
9test('navigator.hardwareConcurrency is positive', navigator.hardwareConcurrency >= 1, true);
10test('navigator.hardwareConcurrency is integer', Number.isInteger(navigator.hardwareConcurrency), true);
11
12test('navigator.language exists', typeof navigator.language, 'string');
13test('navigator.language is en-US', navigator.language, 'en-US');
14
15test('navigator.languages exists', Array.isArray(navigator.languages), true);
16test('navigator.languages length', navigator.languages.length >= 1, true);
17test('navigator.languages contains language', navigator.languages.includes(navigator.language), true);
18
19test('navigator.platform exists', typeof navigator.platform, 'string');
20test('navigator.platform is non-empty', navigator.platform.length > 0, true);
21
22test('navigator.userAgent exists', typeof navigator.userAgent, 'string');
23test('navigator.userAgent starts with Ant', navigator.userAgent.startsWith('Ant/'), true);
24
25console.log('\nLockManager Tests\n');
26
27test('navigator.locks exists', typeof navigator.locks, 'object');
28test('navigator.locks toStringTag', Object.prototype.toString.call(navigator.locks), '[object LockManager]');
29test('navigator.locks.request exists', typeof navigator.locks.request, 'function');
30test('navigator.locks.query exists', typeof navigator.locks.query, 'function');
31
32(async () => {
33 let exclusiveLockAcquired = false;
34 let exclusiveLockName = null;
35 let exclusiveLockMode = null;
36 let exclusiveLockReleased = false;
37
38 await navigator.locks
39 .request('test_resource', async lock => {
40 exclusiveLockAcquired = true;
41 exclusiveLockName = lock.name;
42 exclusiveLockMode = lock.mode;
43 return 'done';
44 })
45 .then(() => {
46 exclusiveLockReleased = true;
47 });
48
49 test('exclusive lock was acquired', exclusiveLockAcquired, true);
50 test('exclusive lock has correct name', exclusiveLockName, 'test_resource');
51 test('exclusive lock has correct mode', exclusiveLockMode, 'exclusive');
52 test('exclusive lock was released', exclusiveLockReleased, true);
53
54 let sharedLockMode = null;
55
56 await navigator.locks.request('shared_resource', { mode: 'shared' }, async lock => {
57 sharedLockMode = lock.mode;
58 });
59
60 test('shared lock has correct mode', sharedLockMode, 'shared');
61
62 let ifAvailableResult = null;
63
64 await navigator.locks.request('available_resource', { ifAvailable: true }, async lock => {
65 ifAvailableResult = lock ? 'acquired' : 'not available';
66 });
67
68 test('ifAvailable lock was acquired', ifAvailableResult, 'acquired');
69
70 const queryResult = await navigator.locks.query();
71
72 test('query returns object', typeof queryResult, 'object');
73 test('query has held array', Array.isArray(queryResult.held), true);
74 test('query has pending array', Array.isArray(queryResult.pending), true);
75
76 let lockOrder = [];
77
78 await navigator.locks.request('order_test', async lock => {
79 lockOrder.push(1);
80 });
81
82 await navigator.locks.request('order_test', async lock => {
83 lockOrder.push(2);
84 });
85
86 testDeep('locks execute in order', lockOrder, [1, 2]);
87
88 let lockToStringTag = null;
89 await navigator.locks.request('tostring_test', async lock => {
90 lockToStringTag = Object.prototype.toString.call(lock);
91 });
92
93 test('Lock toStringTag', lockToStringTag, '[object Lock]');
94
95 summary();
96})();