Files
cocos-engine/tests/core/node.test.ts
Santy-Wang 98e52e3f16 output warning info when attached to the node has zero scaling (#10524)
* output warning info when attached to the node has zero scaling

* use approx instead
2022-03-26 22:23:29 +08:00

149 lines
5.4 KiB
TypeScript

import { Node, Scene } from "../../cocos/core/scene-graph"
import { Mat4, Quat, Vec3 } from "../../cocos/core/math"
import { director } from "../../cocos/core";
import { NodeEventType } from "../../cocos/core/scene-graph/node-event";
import { NodeUIProperties } from "../../cocos/core/scene-graph/node-ui-properties";
describe(`Node`, () => {
test('@inverseTransformPoint', () => {
let scene = new Scene('temp');
let parentNode = new Node();
let subNode = new Node();
parentNode.setPosition(20, -30, 100);
subNode.setPosition(55, 35, 22);
parentNode.parent = scene;
subNode.parent = parentNode;
let p = new Vec3(100, 200, 0);
subNode.inverseTransformPoint(p, p);
expect(p).toStrictEqual(new Vec3(25, 195, -122));
});
test('get-current-path',() => {
let scene = new Scene('tempScene');
let node1: Node = new Node();
node1.name = 'node1';
node1.setParent(scene);
let node2: Node = new Node();
node2.name = 'node2';
node2.setParent(node1);
let node3: Node = new Node();
node3.name = 'node3';
node3.setParent(node2);
let node3Bro: Node = new Node();
node3Bro.name = 'node3Bro';
node3Bro.setParent(node2);
let path1 = node1.getPathInHierarchy();
expect(path1).toStrictEqual('node1');
let path2 = node2.getPathInHierarchy();
expect(path2).toStrictEqual('node1/node2');
let path3 = node3.getPathInHierarchy();
expect(path3).toStrictEqual('node1/node2/node3');
let path3Bro = node3Bro.getPathInHierarchy();
expect(path3Bro).toStrictEqual('node1/node2/node3Bro');
});
test('active-in-hierarchy-changed', () => {
const scene = new Scene('');
director.runSceneImmediate(scene);
const node = new Node();
const cb = jest.fn((node: Node) => {
expect(node.activeInHierarchy).toBeTruthy();
});
node.once(NodeEventType.ACTIVE_IN_HIERARCHY_CHANGED, cb);
scene.addChild(node);
const cb1 = jest.fn((node: Node) => {
expect(node.activeInHierarchy).toBeFalsy();
});
node.once(NodeEventType.ACTIVE_IN_HIERARCHY_CHANGED, cb1);
node.active = false;
node.once(NodeEventType.ACTIVE_IN_HIERARCHY_CHANGED, cb);
node.active = true;
const node2 = new Node();
scene.addChild(node2);
node2.active = false;
node.once(NodeEventType.ACTIVE_IN_HIERARCHY_CHANGED, cb1);
node2.addChild(node);
node.once(NodeEventType.ACTIVE_IN_HIERARCHY_CHANGED, cb);
node.setParent(scene);
expect(cb).toBeCalledTimes(3);
expect(cb1).toBeCalledTimes(2);
});
test('active-undefined', () => {
let scene = new Scene('temp');
let node = new Node();
node.parent = scene;
node.active = true;
node.active = undefined;
expect(node.active).toBe(false);
node.active = true;
node.active = null;
expect(node.active).toBe(false);
// @ts-expect-error
node.active = '' as boolean;
// @ts-expect-error
node.active = 0 as boolean;
node.active = true;
expect(node.active).toBe(true);
});
test('set parent and keep world transform', () => {
let scene = new Scene('temp');
let node = new Node();
node.parent = scene;
node.position = new Vec3(10, 3.5, -2.4);
node.eulerAngles = new Vec3(47.5, 23, -3);
node.scale = new Vec3(2, 0.5, 1);
let node2 = new Node();
node2.position = new Vec3(5, -10, 3);
node2.eulerAngles = new Vec3(0, 90, 45);
node2.scale = new Vec3(1, 1, 2);
node2.parent = scene;
const globalPosition = node2.worldPosition.clone();
node2.setParent(node, true);
node2.updateWorldTransform();
expect(node2.worldPosition.equals(globalPosition)).toBeTruthy();
expect(Vec3.transformMat4(new Vec3(), new Vec3(0, 0, 0), node2.worldMatrix).equals(new Vec3(5, -10, 3))).toBeTruthy();
expect(Mat4.multiply(new Mat4, Mat4.invert(new Mat4, node.worldMatrix), node2.worldMatrix).equals(Mat4.fromRTS(new Mat4(), node2.rotation, node2.position, node2.scale))).toBeTruthy();
node2.setParent(scene, true);
node2.updateWorldTransform();
expect(node2.worldPosition.equals(globalPosition)).toBeTruthy();
expect(Vec3.transformMat4(new Vec3(), new Vec3(0, 0, 0), node2.worldMatrix).equals(new Vec3(5, -10, 3))).toBeTruthy();
expect(node2.worldMatrix.equals(Mat4.fromRTS(new Mat4(), node2.rotation, node2.position, node2.scale))).toBeTruthy();
const rot = node2.rotation.clone();
const scale = node2.scale.clone();
const pos = node2.position.clone();
const worldMat = node2.worldMatrix.clone();
// set parent's scale to zero
node.scale = new Vec3(0, 2, 1);
node2.setParent(node, true);
node2.updateWorldTransform();
expect(node2.position.equals(pos)).toBeTruthy();
expect(node2.rotation.equals(rot)).toBeTruthy();
expect(node2.scale.equals(scale)).toBeTruthy();
expect(node2.worldPosition.equals(globalPosition)).toBeFalsy();
expect(node2.worldMatrix.equals(worldMat)).toBeFalsy();
expect(Mat4.determinant(node2.worldMatrix)).toBeCloseTo(0, 6);
});
});