diff --git a/tests/cypress/integration/actions_objects/case_37_object_make_copy.js b/tests/cypress/integration/actions_objects/case_37_object_make_copy.js index 14927eabf602..cdac31b8458f 100644 --- a/tests/cypress/integration/actions_objects/case_37_object_make_copy.js +++ b/tests/cypress/integration/actions_objects/case_37_object_make_copy.js @@ -1,4 +1,4 @@ -// Copyright (C) 2020-2021 Intel Corporation +// Copyright (C) 2020-2022 Intel Corporation // // SPDX-License-Identifier: MIT @@ -56,7 +56,15 @@ context('Object make a copy.', () => { complete: true, numberOfPoints: null, }; - const countObject = 5; + const createEllipseShape = { + type: 'Shape', + labelName, + cx: 550, + cy: 100, + rightX: 600, + topY: 150, + }; + const countObject = 6; function checkObjectArrSize(expectedValueShape, expectedValueSidebar) { cy.get('.cvat_canvas_shape').then(($cvatCanvasShape) => { @@ -79,6 +87,9 @@ context('Object make a copy.', () => { function compareObjectsSidebarAttr(objectSidebar1, objectSidebar2) { cy.get(objectSidebar1).then(($cvatObjectsSidebarStateItem1) => { cy.get(objectSidebar2).then(($cvatObjectsSidebarStateItem2) => { + // Check type of a shape + expect($cvatObjectsSidebarStateItem1.text().match(/[a-zA-Z]+/)[0]) + .be.eq($cvatObjectsSidebarStateItem2.text().match(/[a-zA-Z]+/)[0]); expect($cvatObjectsSidebarStateItem1.attr('style')).be.eq($cvatObjectsSidebarStateItem2.attr('style')); }); }); @@ -90,6 +101,7 @@ context('Object make a copy.', () => { cy.createCuboid(createCuboidShape2Points); cy.createPolygon(createPolygonShape); cy.createPolyline(createPolylinesShape); + cy.createEllipse(createEllipseShape); cy.createPoint(createPointsShape); cy.createTag(labelName); }); @@ -102,7 +114,8 @@ context('Object make a copy.', () => { cy.get(`#cvat-objects-sidebar-state-item-${id}`).within(() => { cy.get('[aria-label="more"]').trigger('mouseover').wait(300); // Wait dropdown menu transition }); - cy.get('.cvat-object-item-menu').last().should('be.visible').contains('button', 'Make a copy').click(); // Get the last element from cvat-object-item-menu array + // Get the last element from cvat-object-item-menu array + cy.get('.cvat-object-item-menu').last().should('be.visible').contains('button', 'Make a copy').click(); cy.get('.cvat-canvas-container').click(coordX, coordY); cy.get('.cvat-canvas-container').click(); coordX += 100; @@ -110,16 +123,16 @@ context('Object make a copy.', () => { }); it('After copying via sidebar, the attributes of the objects are the same.', () => { - checkObjectArrSize(10, 12); + checkObjectArrSize(12, 14); for (let id = 1; id < countObject; id++) { - // Parameters id 1 equal patameters id 7, 2 to 8, etc. + // Parameters id 1 equal patameters id 8, 2 to 9, etc. compareObjectsAttr(`#cvat_canvas_shape_${id}`, `#cvat_canvas_shape_${id + countObject + 1}`); } for (let idSidebar = 1; idSidebar < 7; idSidebar++) { compareObjectsSidebarAttr( `#cvat-objects-sidebar-state-item-${idSidebar}`, `#cvat-objects-sidebar-state-item-${idSidebar + countObject + 1}`, - ); // Parameters sidebar id 1 equal patameters sidebar id 7, 2 to 8, etc. + ); // Parameters sidebar id 1 equal patameters sidebar id 8, 2 to 9, etc. } }); @@ -140,7 +153,8 @@ context('Object make a copy.', () => { .find('[aria-label="more"]') .trigger('mouseover') .wait(300); // Wait dropdown menu transition; - cy.get('.cvat-object-item-menu').last().should('be.visible').contains('button', 'Make a copy').click(); // Get the last element from cvat-object-item-menu array + // Get the last element from cvat-object-item-menu array + cy.get('.cvat-object-item-menu').last().should('be.visible').contains('button', 'Make a copy').click(); cy.get('.cvat-canvas-container').click(coordX, coordY); cy.get('.cvat-canvas-container').click(); // Deactivate all objects and hide context menu coordX += 100; @@ -151,16 +165,16 @@ context('Object make a copy.', () => { 'After copying via object context menu, the attributes of the objects are the same.', { browser: '!firefox' }, () => { - checkObjectArrSize(14, 16); // The point and tag was not copied via the object's context menu + checkObjectArrSize(17, 19); // The point and tag was not copied via the object's context menu for (let id = 1; id < countObject; id++) { // Parameters id 1 equal patameters id 13, 2 to 14, etc. - compareObjectsAttr(`#cvat_canvas_shape_${id}`, `#cvat_canvas_shape_${id + countObject + 7}`); + compareObjectsAttr(`#cvat_canvas_shape_${id}`, `#cvat_canvas_shape_${id + countObject + 8}`); } for (let idSidebar = 1; idSidebar < 6; idSidebar++) { compareObjectsSidebarAttr( `#cvat-objects-sidebar-state-item-${idSidebar}`, - `#cvat-objects-sidebar-state-item-${idSidebar + countObject + 6}`, - ); // Parameters sidebar id 1 equal patameters sidebar id 13, 2 to 14, etc. + `#cvat-objects-sidebar-state-item-${idSidebar + countObject + 8}`, + ); // Parameters sidebar id 1 equal patameters sidebar id 15, 2 to 16, etc. } }, ); diff --git a/tests/cypress/integration/actions_objects2/case_108_rotated_bounding_boxes.js b/tests/cypress/integration/actions_objects2/case_108_rotated_bounding_boxes.js index 310ce453901c..3be3d9d999dd 100644 --- a/tests/cypress/integration/actions_objects2/case_108_rotated_bounding_boxes.js +++ b/tests/cypress/integration/actions_objects2/case_108_rotated_bounding_boxes.js @@ -1,10 +1,11 @@ -// Copyright (C) 2021 Intel Corporation +// Copyright (C) 2021-2022 Intel Corporation // // SPDX-License-Identifier: MIT /// import { labelName, taskName } from '../../support/const'; +import { decomposeMatrix } from '../../support/utils'; context('Rotated bounding boxes.', () => { const caseId = '108'; @@ -27,42 +28,6 @@ context('Rotated bounding boxes.', () => { secondY: createRectangleShape2Points.secondY - 150, }; - function deltaTransformPoint(matrix, point) { - const dx = point.x * matrix.a + point.y * matrix.c; - const dy = point.x * matrix.b + point.y * matrix.d; - return { x: dx, y: dy }; - } - - function decomposeMatrix(matrix) { - const px = deltaTransformPoint(matrix, { x: 0, y: 1 }); - const skewX = ((180 / Math.PI) * Math.atan2(px.y, px.x) - 90).toFixed(1); - return skewX; - } - - function testShapeRotate(shape, x, y, expectedRotateDeg, pressShift) { - cy.get(shape) - .trigger('mousemove') - .trigger('mouseover') - .should('have.class', 'cvat_canvas_shape_activated'); - cy.get('.cvat-canvas-container') - .trigger('mousemove', x, y) - .trigger('mouseenter', x, y); - cy.get('.svg_select_points_rot').should('have.class', 'cvat_canvas_selected_point'); - cy.get('.cvat-canvas-container').trigger('mousedown', x, y, { button: 0 }); - if (pressShift) { - cy.get('body').type('{shift}', { release: false }); - } - cy.get('.cvat-canvas-container').trigger('mousemove', x + 20, y); - cy.get(shape).should('have.attr', 'transform'); - cy.document().then((doc) => { - const modShapeIDString = shape.substring(1); // Remove "#" from the shape id string - const shapeTranformMatrix = decomposeMatrix(doc.getElementById(modShapeIDString).getCTM()); - cy.get('#cvat_canvas_text_content').should('contain.text', `${shapeTranformMatrix}°`); - expect(`${expectedRotateDeg}°`).to.be.equal(`${shapeTranformMatrix}°`); - }); - cy.get('.cvat-canvas-container').trigger('mouseup'); - } - function testCompareRotate(shape, toFrame) { for (let frame = 8; frame >= toFrame; frame--) { cy.document().then((doc) => { @@ -101,13 +66,13 @@ context('Rotated bounding boxes.', () => { describe(`Testing case "${caseId}"`, () => { it('Check that bounding boxes can be rotated.', () => { - testShapeRotate( + cy.shapeRotate( '#cvat_canvas_shape_1', (createRectangleShape2Points.firstX + createRectangleShape2Points.secondX) / 2, createRectangleShape2Points.firstY + 20, '33.7', ); - testShapeRotate( + cy.shapeRotate( '#cvat_canvas_shape_2', (createRectangleTrack2Points.firstX + createRectangleTrack2Points.secondX) / 2, createRectangleTrack2Points.firstY + 20, @@ -130,7 +95,7 @@ context('Rotated bounding boxes.', () => { } }); - testShapeRotate('#cvat_canvas_shape_2', 320, 225, '53.0'); + cy.shapeRotate('#cvat_canvas_shape_2', 320, 225, '53.0'); // Comparison of the values of the shape attribute of the current frame with the previous frame testCompareRotate('cvat_canvas_shape_2', 0); @@ -155,7 +120,7 @@ context('Rotated bounding boxes.', () => { cy.get('#cvat_canvas_shape_4').should('be.visible'); cy.goCheckFrameNumber(9); - testShapeRotate( + cy.shapeRotate( '#cvat_canvas_shape_4', (createRectangleShape2Points.firstX + createRectangleShape2Points.secondX) / 2, createRectangleShape2Points.firstY + 20, @@ -182,8 +147,8 @@ context('Rotated bounding boxes.', () => { it('Check rotation with hold Shift button.', () => { cy.goCheckFrameNumber(0); - testShapeRotate('#cvat_canvas_shape_4', 320, 375, '60.0', true); - testShapeRotate('#cvat_canvas_shape_4', 325, 385, '75.0', true); + cy.shapeRotate('#cvat_canvas_shape_4', 320, 375, '60.0', true); + cy.shapeRotate('#cvat_canvas_shape_4', 325, 385, '75.0', true); }); it('Copy/paste a rotated shape.', () => { diff --git a/tests/cypress/integration/actions_objects2/case_115_ellipse_shape_track_label.js b/tests/cypress/integration/actions_objects2/case_115_ellipse_shape_track_label.js new file mode 100644 index 000000000000..6aa33291f3cf --- /dev/null +++ b/tests/cypress/integration/actions_objects2/case_115_ellipse_shape_track_label.js @@ -0,0 +1,96 @@ +// Copyright (C) 2022 Intel Corporation +// +// SPDX-License-Identifier: MIT + +/// + +import { taskName, labelName } from '../../support/const'; +import { decomposeMatrix } from '../../support/utils'; + +context('Actions on ellipse.', () => { + const caseId = '115'; + const newLabelName = `Case ${caseId}`; + const createEllipseShape = { + type: 'Shape', + labelName, + cx: 250, + cy: 350, + rightX: 450, + topY: 280, + }; + const createEllipseTrack = { + type: 'Track', + labelName, + cx: createEllipseShape.cx, + cy: createEllipseShape.cy - 150, + rightX: createEllipseShape.rightX, + topY: createEllipseShape.topY - 150, + }; + const createEllipseShapeSwitchLabel = { + type: 'Shape', + labelName: newLabelName, + cx: createEllipseShape.cx + 250, + cy: createEllipseShape.cy, + rightX: createEllipseShape.rightX + 250, + topY: createEllipseShape.topY, + }; + const createEllipseTrackSwitchLabel = { + type: 'Track', + labelName: newLabelName, + cx: createEllipseShape.cx + 250, + cy: createEllipseShape.cy - 150, + rightX: createEllipseShape.rightX + 250, + topY: createEllipseShape.topY - 150, + }; + + function testCompareRotate(shape, toFrame) { + for (let frame = 8; frame >= toFrame; frame--) { + cy.document().then((doc) => { + const shapeTranformMatrix = decomposeMatrix(doc.getElementById(shape).getCTM()); + cy.goToPreviousFrame(frame); + cy.document().then((doc2) => { + const shapeTranformMatrix2 = decomposeMatrix(doc2.getElementById(shape).getCTM()); + expect(shapeTranformMatrix).not.deep.eq(shapeTranformMatrix2); + }); + }); + } + } + + before(() => { + cy.openTask(taskName); + cy.addNewLabel(newLabelName); + cy.openJob(); + }); + + describe(`Testing case "${caseId}"`, () => { + it('Draw a ellipse shape, track, second label.', () => { + cy.createEllipse(createEllipseShape); + cy.createEllipse(createEllipseTrack); + cy.createEllipse(createEllipseShapeSwitchLabel); + cy.createEllipse(createEllipseTrackSwitchLabel); + }); + + it('Ellipse rotation/interpolation.', () => { + Cypress.config('scrollBehavior', false); + cy.get('.cvat-player-last-button').click(); + cy.shapeRotate( + '#cvat_canvas_shape_4', + (createEllipseTrackSwitchLabel.rightX + createEllipseTrackSwitchLabel.cx) / 2, + createEllipseTrackSwitchLabel.topY + 20, + '53.1', + false, + false, + ); + testCompareRotate('cvat_canvas_shape_4', 0); + // Rotation with shift + cy.shapeRotate( + '#cvat_canvas_shape_4', + (createEllipseTrackSwitchLabel.rightX + createEllipseTrackSwitchLabel.cx) / 2, + createEllipseTrackSwitchLabel.topY + 20, + '60.0', + true, + false, + ); + }); + }); +}); diff --git a/tests/cypress/integration/actions_tasks3/case_18_filters_functionality.js b/tests/cypress/integration/actions_tasks3/case_18_filters_functionality.js index 5a5aa697abe9..07934d0343da 100644 --- a/tests/cypress/integration/actions_tasks3/case_18_filters_functionality.js +++ b/tests/cypress/integration/actions_tasks3/case_18_filters_functionality.js @@ -1,4 +1,4 @@ -// Copyright (C) 2020-2021 Intel Corporation +// Copyright (C) 2020-2022 Intel Corporation // // SPDX-License-Identifier: MIT @@ -67,6 +67,14 @@ context('Filters functionality.', () => { ], numberOfPoints: 4, }; + const createEllipseTrack = { + type: 'Track', + labelName: labelTrack, + cx: 250, + cy: 350, + rightX: 450, + topY: 280, + }; const cvatCanvasShapeList = []; const cvatFiltesList = []; @@ -101,6 +109,7 @@ context('Filters functionality.', () => { cvatCanvasShapeList.push(Number($cvatCanvasShapeList[i].id.match(/\d+$/))); } }); + cy.createEllipse(createEllipseTrack); }); it('Filter: shape == "polygon". Only the polygon exist.', () => { @@ -164,7 +173,7 @@ context('Filters functionality.', () => { value: labelTrack, submit: true, }); - checkingFilterApplication([2, 4]); // #cvat_canvas_shape_2,4, #cvat-objects-sidebar-state-item-2,4 + checkingFilterApplication([2, 4, 5]); // #cvat_canvas_shape_2,4,5, #cvat-objects-sidebar-state-item-2,4,5 cy.clearFilters(); // Clear filters }); @@ -182,8 +191,8 @@ context('Filters functionality.', () => { labelAttr: 'count points', submit: true, }); - // #cvat_canvas_shape_2,4, #cvat-objects-sidebar-state-item-2,4 - checkingFilterApplication([2, 4]); + // #cvat_canvas_shape_2,4,5, #cvat-objects-sidebar-state-item-2,4,5 + checkingFilterApplication([2, 4, 5]); cy.clearFilters(); // Clear filters }); @@ -200,8 +209,8 @@ context('Filters functionality.', () => { value: 'Height', submit: true, }); - // #cvat_canvas_shape_1,2,3,4, #cvat-objects-sidebar-state-item-1,2,3,4 - checkingFilterApplication([1, 2, 3, 4]); + // #cvat_canvas_shape_1,2,3,4,5, #cvat-objects-sidebar-state-item-1,2,3,4,5 + checkingFilterApplication([1, 2, 3, 4, 5]); cy.clearFilters(); // Clear filters }); @@ -244,7 +253,7 @@ context('Filters functionality.', () => { cy.setFilter({ groupIndex: 2, ruleIndex: 3, field: 'Width', operator: '>', value: '60', submit: true, }); - checkingFilterApplication([2, 4]); // #cvat_canvas_shape_2,4, #cvat-objects-sidebar-state-item-2,4 + checkingFilterApplication([2, 4, 5]); // #cvat_canvas_shape_2,4,5, #cvat-objects-sidebar-state-item-2,4,5 cy.clearFilters(); // Clear filters }); @@ -280,6 +289,22 @@ context('Filters functionality.', () => { cy.clearFilters(); // Clear filters }); + it('Filter: shape == "ellipse". Only the ellipse exist.', () => { + const textFilter = 'shape == "ellipse"'; + cvatFiltesList.push(textFilter); + cy.addFiltersRule(0); + cy.setFilter({ + groupIndex: 0, + ruleIndex: 0, + field: 'Shape', + operator: '==', + value: 'ellipse', + submit: true, + }); + checkingFilterApplication([5]); // #cvat_canvas_shape_5, #cvat-objects-sidebar-state-item-5 + cy.clearFilters(); // Clear filters + }); + it('Verify to show all filters', () => { cy.сheckFiltersModalOpened(); cy.get('.recently-used-wrapper').trigger('mouseover'); diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index da64e1ef8c9a..9ef50846ed84 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -1,9 +1,11 @@ -// Copyright (C) 2020-2021 Intel Corporation +// Copyright (C) 2020-2022 Intel Corporation // // SPDX-License-Identifier: MIT /// +import { decomposeMatrix } from './utils'; + require('cypress-file-upload'); require('../plugins/imageGenerator/imageGeneratorCommand'); require('../plugins/createZipArchive/createZipArchiveCommand'); @@ -799,3 +801,30 @@ Cypress.Commands.add('exportTask', ({ cy.get('.cvat-notification-notice-export-task-start').should('be.visible'); cy.closeNotification('.cvat-notification-notice-export-task-start'); }); + +// FIXME: remove "checkText" after implementstion for ellipse +Cypress.Commands.add('shapeRotate', (shape, x, y, expectedRotateDeg, pressShift, checkText = true) => { + cy.get(shape) + .trigger('mousemove') + .trigger('mouseover') + .should('have.class', 'cvat_canvas_shape_activated'); + cy.get('.cvat-canvas-container') + .trigger('mousemove', x, y) + .trigger('mouseenter', x, y); + cy.get('.svg_select_points_rot').should('have.class', 'cvat_canvas_selected_point'); + cy.get('.cvat-canvas-container').trigger('mousedown', x, y, { button: 0 }); + if (pressShift) { + cy.get('body').type('{shift}', { release: false }); + } + cy.get('.cvat-canvas-container').trigger('mousemove', x + 20, y); + cy.get(shape).should('have.attr', 'transform'); + cy.document().then((doc) => { + const modShapeIDString = shape.substring(1); // Remove "#" from the shape id string + const shapeTranformMatrix = decomposeMatrix(doc.getElementById(modShapeIDString).getCTM()); + if (checkText) { + cy.get('#cvat_canvas_text_content').should('contain.text', `${shapeTranformMatrix}°`); + } + expect(`${expectedRotateDeg}°`).to.be.equal(`${shapeTranformMatrix}°`); + }); + cy.get('.cvat-canvas-container').trigger('mouseup'); +}); diff --git a/tests/cypress/support/utils.js b/tests/cypress/support/utils.js index 975d61e217a9..441fae14497c 100644 --- a/tests/cypress/support/utils.js +++ b/tests/cypress/support/utils.js @@ -1,4 +1,4 @@ -// Copyright (C) 2021 Intel Corporation +// Copyright (C) 2021-2022 Intel Corporation // // SPDX-License-Identifier: MIT @@ -9,3 +9,15 @@ export function generateString(countPointsToMove, arrow) { } return action; } + +function deltaTransformPoint(matrix, point) { + const dx = point.x * matrix.a + point.y * matrix.c; + const dy = point.x * matrix.b + point.y * matrix.d; + return { x: dx, y: dy }; +} + +export function decomposeMatrix(matrix) { + const px = deltaTransformPoint(matrix, { x: 0, y: 1 }); + const skewX = ((180 / Math.PI) * Math.atan2(px.y, px.x) - 90).toFixed(1); + return skewX; +}