ar_anchor_states.https.html (4235B)
1 <!DOCTYPE html> 2 <script src="/resources/testharness.js"></script> 3 <script src="/resources/testharnessreport.js"></script> 4 <script src="../resources/webxr_util.js"></script> 5 <script src="../resources/webxr_test_asserts.js"></script> 6 <script src="../resources/webxr_test_constants.js"></script> 7 <script src="../resources/webxr_test_constants_fake_world.js"></script> 8 9 <script> 10 11 // 1m above world origin. 12 const VIEWER_ORIGIN_TRANSFORM = { 13 position: [0, 1, 0], 14 orientation: [0, 0, 0, 1], 15 }; 16 17 const fakeDeviceInitParams = { 18 supportedModes: ["immersive-ar"], 19 views: VALID_VIEWS, 20 supportedFeatures: ALL_FEATURES, 21 viewerOrigin: VIEWER_ORIGIN_TRANSFORM, 22 }; 23 24 // Creates a test method that leverages anchors API. 25 // |expectSucceeded| - true if the anchors creation request is expected to succeed, false otherwise 26 // |endSession| - true if the test case should call session.end() prior to creating an anchor 27 // |expectedError| - expected error name that should be returned in case expectSucceeded is false 28 const testFunctionGenerator = function(expectSucceeded, endSession, expectedError) { 29 30 const testFunction = function(session, fakeDeviceController, t) { 31 32 const debug = xr_debug.bind(this, 'testAnchorStates'); 33 34 fakeDeviceController.setAnchorCreationCallback((parameters, controller) => { 35 // All anchor creation requests that reach this stage should be marked as successful. 36 // If this test is expected to fail, the failure will happen earlier in the anchor 37 // creation process. 38 return Promise.resolve(true); 39 }); 40 41 const watcherDone = new Event("watcherdone"); 42 const eventWatcher = new EventWatcher(t, session, ["watcherdone"]); 43 const eventPromise = eventWatcher.wait_for(["watcherdone"]); 44 45 session.requestReferenceSpace('local').then((localRefSpace) => { 46 47 const onFrame = function(time, frame) { 48 debug("rAF 1"); 49 50 let setUpPromise = Promise.resolve(); 51 if(endSession) { 52 debug("ending session"); 53 setUpPromise = session.end(); 54 } 55 56 setUpPromise.then(() => { 57 debug("creating anchor"); 58 frame.createAnchor(new XRRigidTransform(), localRefSpace) 59 .then((anchor) => { 60 debug("anchor created"); 61 62 t.step(() => { 63 assert_true(expectSucceeded, 64 "`createAnchor` succeeded when it was expected to fail"); 65 }); 66 67 session.dispatchEvent(watcherDone); 68 }).catch((error) => { 69 debug("anchor creation failed"); 70 71 t.step(() => { 72 assert_false(expectSucceeded, 73 "`createAnchor` failed when it was expected to succeed, error: " + error); 74 assert_equals(error.name, expectedError, 75 "`createAnchor` failed with unexpected error name"); 76 }); 77 78 session.dispatchEvent(watcherDone); 79 }); 80 81 // Anchor result will only take effect with frame data - schedule 82 // a frame after we requested anchor creation, otherwise the test will time out. 83 session.requestAnimationFrame(() => { 84 debug("rAF 2"); 85 }); 86 }); // setUpPromise.then(() => { ... }) 87 }; // onFrame() { ... } 88 89 debug("requesting animation frame"); 90 session.requestAnimationFrame(onFrame); 91 }); // session.requestReferenceSpace(...) 92 93 return eventPromise; 94 }; // testFunction 95 96 return testFunction; 97 }; 98 99 xr_session_promise_test("Anchor creation succeeds if the feature was requested", 100 testFunctionGenerator(/*expectSucceeded=*/true, /*endSession=*/false), 101 fakeDeviceInitParams, 102 'immersive-ar', { 'requiredFeatures': ['anchors'] }); 103 104 xr_session_promise_test("Anchor creation fails if the feature was not requested", 105 testFunctionGenerator(/*expectSucceeded=*/false, /*endSession=*/false, "NotSupportedError"), 106 fakeDeviceInitParams, 107 'immersive-ar', {}); 108 109 xr_session_promise_test("Anchor creation fails if the feature was requested but the session already ended", 110 testFunctionGenerator(/*expectSucceeded=*/false, /*endSession=*/true, "InvalidStateError"), 111 fakeDeviceInitParams, 112 'immersive-ar', { 'requiredFeatures': ['anchors'] }); 113 114 </script>