From 5a42a77e2fc380e5840bf2dd01aaffd36013346a Mon Sep 17 00:00:00 2001 From: "Val Erastov (xibyte)" Date: Wed, 20 May 2020 00:07:33 -0700 Subject: [PATCH] working on the test infrastructure --- modules/ui/components/Menu.jsx | 1 + test/coreTests/subjects/modellerTPI.js | 18 +++- .../integration/part3d/wizards.spec.js | 9 +- test/cypress/support/commands.js | 13 ++- .../scene/controls/mouseEventSystemPlugin.js | 95 +++++++++++++++---- .../cad/scene/controls/pickControlPlugin.js | 13 +-- web/app/cad/scene/controls/rayCastDebug.js | 20 ++++ 7 files changed, 134 insertions(+), 35 deletions(-) create mode 100644 web/app/cad/scene/controls/rayCastDebug.js diff --git a/modules/ui/components/Menu.jsx b/modules/ui/components/Menu.jsx index bf571614..c5a69753 100644 --- a/modules/ui/components/Menu.jsx +++ b/modules/ui/components/Menu.jsx @@ -16,6 +16,7 @@ export default function Menu({children, x, y, orientationUp, centered, menuId, . top={orientationUp ? undefined : y} bottom={orientationUp ? y : undefined} centered={centered} + data-menu-id={menuId} {...props}> {children} ; diff --git a/test/coreTests/subjects/modellerTPI.js b/test/coreTests/subjects/modellerTPI.js index 132294ad..18410206 100644 --- a/test/coreTests/subjects/modellerTPI.js +++ b/test/coreTests/subjects/modellerTPI.js @@ -4,6 +4,7 @@ import { PICK_KIND, traversePickResults } from '../../../web/app/cad/scene/controls/pickControlPlugin'; +import {Vector3} from "three"; export default ctx => { @@ -59,11 +60,22 @@ export default ctx => { function selectFirst(type) { ctx.services.pickControl.pick(ctx.services.cadRegistry.models.find(m => m.TYPE === type)); } - + + function simulateClickByRayCast(from, to) { + ctx.services.pickControl.simulatePickFromRay(from, to); + + const {x, y} = ctx.services.viewer.sceneSetup.modelToScreen( new Vector3().fromArray(from) ); + + const hits = ctx.services.viewer.customRaycast(from, to, ctx.services.cadScene.workGroup.children); + ctx.services.modelMouseEventSystem.dispatchMousemove(mouseEvent('mousemove', x, y), hits); + ctx.services.modelMouseEventSystem.dispatchMousedown(mouseEvent('mousedown', x, y), hits); + ctx.services.modelMouseEventSystem.dispatchMouseup(mouseEvent('mouseup', x, y), hits); + } + function getWizardContext() { return ctx.streams.wizard.wizardContext.value } - + function openSketcher() { ctx.services.action.run('EditFace'); return createSubjectFromInPlaceSketcher(ctx); @@ -75,7 +87,7 @@ export default ctx => { return { context: ctx, - openWizard, wizardOK, sceneMouseEvent, clickOnScene, + openWizard, wizardOK, sceneMouseEvent, clickOnScene, simulateClickByRayCast, rayCast, rayCastFaces, select, selectFaces, selectFirst, openSketcher, commitSketch, get wizardContext() { return getWizardContext()}, __DEBUG__: ctx.services.debug.utils diff --git a/test/cypress/integration/part3d/wizards.spec.js b/test/cypress/integration/part3d/wizards.spec.js index 948b257d..eb089b11 100644 --- a/test/cypress/integration/part3d/wizards.spec.js +++ b/test/cypress/integration/part3d/wizards.spec.js @@ -50,15 +50,20 @@ describe("Wizrds", () => { }); - it("move datum", () => { + it.only("move datum", () => { createDatum(); + cy.simulateClickByRayCast([10, 15, 76], [154, -25, -56]); + cy.getMenu('datum').within(() => { + cy.getActionButton('DATUM_ROTATE').click() + }) + }); }); function createDatum() { - cy.visit("http://localhost:3000"); + cy.get('[info="originates a new datum from origin or off of a selected face"]').click(); cy.get('.x-Field-active > .number > input').type("100"); diff --git a/test/cypress/support/commands.js b/test/cypress/support/commands.js index f69ae04e..61554e19 100644 --- a/test/cypress/support/commands.js +++ b/test/cypress/support/commands.js @@ -2,7 +2,7 @@ import modellerUISubject from "../../coreTests/subjects/modellerTPI"; Cypress.Commands.add("openModeller", () => { - return cy.visit("http://localhost:3000?test&LOG.PICK=true");; + return cy.visit("http://localhost:3000?test&LOG.PICK=true"); }); @@ -10,6 +10,9 @@ Cypress.Commands.add("getActionButton", (actionId) => { return cy.get(`[data-action-id='${actionId}']`); }); +Cypress.Commands.add("getMenu", (menuId) => { + return cy.get(`[data-menu-id='${menuId}']`); +}); Cypress.Commands.add("getActiveWizardField", (fieldName) => { @@ -24,6 +27,14 @@ Cypress.Commands.add("selectRaycasting", (from, to) => { }); }); +Cypress.Commands.add("simulateClickByRayCast", (from, to) => { + cy.getModellerTPI().then(tpi => { + tpi.simulateClickByRayCast(from, to); + tpi.__DEBUG__.AddSegment3(from, to); + }); + +}); + Cypress.Commands.add("openSketcher", () => { return cy.getModellerTPI().then(tpi => tpi.openSketcher()); }); diff --git a/web/app/cad/scene/controls/mouseEventSystemPlugin.js b/web/app/cad/scene/controls/mouseEventSystemPlugin.js index 30f26059..d2b1ff09 100644 --- a/web/app/cad/scene/controls/mouseEventSystemPlugin.js +++ b/web/app/cad/scene/controls/mouseEventSystemPlugin.js @@ -1,3 +1,5 @@ +import {printRaycastDebugInfo, RayCastDebugInfo} from "./rayCastDebug"; +import {LOG_FLAGS} from "../../logFlags"; export function activate(context) { const {services, streams} = context; @@ -10,7 +12,7 @@ export function activate(context) { domElement.addEventListener('mouseup', mouseup, false); domElement.addEventListener('mousemove', mousemove, false); - let performRaycast = e => services.viewer.raycast(e, services.cadScene.workGroup.children); + let performRaycast = e => services.viewer.raycast(e, services.cadScene.workGroup.children, RayCastDebugInfo); let toDrag = null; let pressed = new Set(); @@ -30,12 +32,20 @@ export function activate(context) { } function mousedown(e) { - event.mouseEvent = e; - pressed.clear(); let hits = performRaycast(e); + dispatchMousedown(e, hits); + } + + function dispatchMousedown(e, hits) { + event.mouseEvent = e; event.hits = hits; - + pressed.clear(); + for (let hit of hits) { + if (LOG_FLAGS.PICK) { + printRaycastDebugInfo('mouseDown', hit); + } + let obj = hit.object; if (obj && obj.onMouseDown) { obj.onMouseDown(event); @@ -54,24 +64,33 @@ export function activate(context) { mousemove(e); } else { let hits = performRaycast(e); - event.hits = hits; - - for (let hit of hits) { - let obj = hit.object; - if (obj && obj.onMouseUp) { - obj.onMouseUp(event); - } - if (pressed.has(obj) && obj.onMouseClick) { - obj.onMouseClick(event); - } - if (!hit.object.passMouseEvent || !hit.object.passMouseEvent(event)) { - break; - } - } - pressed.clear(); + dispatchMouseup(e, hits); } } + function dispatchMouseup(e, hits) { + + event.mouseEvent = e; + event.hits = hits; + + for (let hit of hits) { + if (LOG_FLAGS.PICK) { + printRaycastDebugInfo('mouseUp', hit); + } + let obj = hit.object; + if (obj && obj.onMouseUp) { + obj.onMouseUp(event); + } + if (pressed.has(obj) && obj.onMouseClick) { + obj.onMouseClick(event); + } + if (!hit.object.passMouseEvent || !hit.object.passMouseEvent(event)) { + break; + } + } + pressed.clear(); + } + let entered = new Set(); let valid = new Set(); @@ -82,6 +101,7 @@ export function activate(context) { toDrag.dragMove(event); } else { let hits = performRaycast(e); + dispatchMousemove(e, hits) event.hits = hits; valid.clear(); @@ -113,6 +133,43 @@ export function activate(context) { valid.clear(); } } + + function dispatchMousemove(e, hits) { + event.mouseEvent = e; + event.hits = hits; + + valid.clear(); + for (let hit of hits) { + valid.add(hit.object); + if (!hit.object.passMouseEvent || !hit.object.passMouseEvent(event)) { + break; + } + } + + entered.forEach(el => { + if (!valid.has(el) && el.onMouseLeave) { + el.onMouseLeave(event); + } + }); + + valid.forEach(el => { + if (!entered.has(el) && el.onMouseEnter) { + el.onMouseEnter(event); + } + if (el.onMouseMove) { + el.onMouseMove(event); + } + }); + + let t = valid; + valid = entered; + entered = t; + valid.clear(); + } + + context.services.modelMouseEventSystem = { + dispatchMousedown, dispatchMouseup, dispatchMousemove + } } export function hasObject(hits, object) { diff --git a/web/app/cad/scene/controls/pickControlPlugin.js b/web/app/cad/scene/controls/pickControlPlugin.js index bf1290b1..ff906568 100644 --- a/web/app/cad/scene/controls/pickControlPlugin.js +++ b/web/app/cad/scene/controls/pickControlPlugin.js @@ -3,6 +3,7 @@ import {getAttribute, setAttribute} from 'scene/objectData'; import {FACE, EDGE, SKETCH_OBJECT, DATUM, SHELL, DATUM_AXIS, LOOP} from '../entites'; import {LOG_FLAGS} from '../../logFlags'; import * as vec from 'math/vec'; +import {initRayCastDebug, printRaycastDebugInfo, RayCastDebugInfo} from "./rayCastDebug"; export const PICK_KIND = { FACE: mask.type(1), @@ -22,7 +23,6 @@ const DEFAULT_SELECTION_MODE = Object.freeze({ datum: true }); -let RayCastDebugInfo; export const ALL_EXCLUDING_SOLID_KINDS = PICK_KIND.FACE | PICK_KIND.SKETCH | PICK_KIND.EDGE | PICK_KIND.DATUM_AXIS | PICK_KIND.LOOP; @@ -147,7 +147,7 @@ export function activate(context) { }; if (LOG_FLAGS.PICK) { - RayCastDebugInfo = {}; + initRayCastDebug(); } } @@ -212,7 +212,6 @@ export function traversePickResults(event, pickResults, kind, visitor) { } } - function printPickInfo(model, rayCastData) { console.log("PICKED MODEL:"); console.dir(model); @@ -221,12 +220,6 @@ function printPickInfo(model, rayCastData) { console.dir(rayCastData); let pt = rayCastData.point; console.log('POINT: ' + pt.x + ', ' + pt.y + ',' + pt.z); - if (RayCastDebugInfo && RayCastDebugInfo.ray) { - //generating test data - const BUFFER = 100; - const r = vec.fromXYZ(pt).map(Math.round); - const dir = vec._mul(vec.fromXYZ(RayCastDebugInfo.ray.direction), BUFFER); - console.log('cy.selectRaycasting(['+ vec.sub(r, dir).map(Math.round).join(', ') + '], [' + vec.add(r, dir).map(Math.round).join(', ') + '])'); - } + printRaycastDebugInfo('selection', rayCastData); } } \ No newline at end of file diff --git a/web/app/cad/scene/controls/rayCastDebug.js b/web/app/cad/scene/controls/rayCastDebug.js new file mode 100644 index 00000000..fdfa55b4 --- /dev/null +++ b/web/app/cad/scene/controls/rayCastDebug.js @@ -0,0 +1,20 @@ +import * as vec from "math/vec"; + +export let RayCastDebugInfo; + +export function initRayCastDebug() { + RayCastDebugInfo = {}; +} + +export function printRaycastDebugInfo(tag , hit) { + if (RayCastDebugInfo && RayCastDebugInfo.ray) { + const pt = hit.point; + //generating test data + const BUFFER = 100; + const r = vec.fromXYZ(pt).map(Math.round); + const dir = vec._mul(vec.fromXYZ(RayCastDebugInfo.ray.direction), BUFFER); + console.log(tag); + console.log('cy.simulateClickByRayCast(['+ vec.sub(r, dir).map(Math.round).join(', ') + '], [' + vec.add(r, dir).map(Math.round).join(', ') + '])'); + } +} +