diff --git a/tests/cypress/integration/actions_tasks_objects/case_13_merge_split_features.js b/tests/cypress/integration/actions_tasks_objects/case_13_merge_split_features.js new file mode 100644 index 00000000..3ef65781 --- /dev/null +++ b/tests/cypress/integration/actions_tasks_objects/case_13_merge_split_features.js @@ -0,0 +1,125 @@ +// Copyright (C) 2020 Intel Corporation +// +// SPDX-License-Identifier: MIT + +/// + +import { taskName } from '../../support/const'; + +context('Merge/split features', () => { + const caseId = '13'; + const createRectangleShape2Points = { + points: 'By 2 Points', + type: 'Shape', + switchLabel: false, + firstX: 250, + firstY: 350, + secondX: 350, + secondY: 450, + }; + const createRectangleShape2PointsSecond = { + points: 'By 2 Points', + type: 'Shape', + switchLabel: false, + firstX: createRectangleShape2Points.firstX + 300, + firstY: createRectangleShape2Points.firstY, + secondX: createRectangleShape2Points.secondX + 300, + secondY: createRectangleShape2Points.secondY, + }; + const frameNum = 0; + // Check the 'X' coordinate. 'Y' coordinate is the same. + let xCoordinatesObjectFirstFrame = 0; + let xCoordinatesObjectThirdFrame = 0; + + before(() => { + cy.openTaskJob(taskName); + }); + + function goCheckFrameNumber(frameNum) { + cy.get('.cvat-player-frame-selector').within(() => { + cy.get('input[role="spinbutton"]').clear().type(`${frameNum}{Enter}`).should('have.value', frameNum); + }); + } + + describe(`Testing case "${caseId}"`, () => { + it('Create rectangle shape on first frame', () => { + goCheckFrameNumber(frameNum); + cy.createRectangle(createRectangleShape2Points); + cy.get('#cvat_canvas_shape_1').should('have.attr', 'x').then(xCoords => { + xCoordinatesObjectFirstFrame = Math.floor(xCoords); + }); + }); + it('Create rectangle shape on third frame with another position', () => { + goCheckFrameNumber(frameNum + 2); + cy.createRectangle(createRectangleShape2PointsSecond); + cy.get('#cvat_canvas_shape_2').should('have.attr', 'x').then(xCoords => { + xCoordinatesObjectThirdFrame = Math.floor(xCoords); + }); + }); + it('Merge the objects with "Merge button"', () => { + cy.get('.cvat-merge-control').click(); + cy.get('#cvat_canvas_shape_2').click(); + goCheckFrameNumber(frameNum); + cy.get('#cvat_canvas_shape_1').click(); + cy.get('.cvat-merge-control').click(); + }); + it('Get a track with keyframes on first and third frame', () => { + cy.get('#cvat_canvas_shape_3').should('exist').and('be.visible'); + cy.get('#cvat-objects-sidebar-state-item-3').should('contain', '3').and('contain', 'RECTANGLE TRACK').within(() => { + cy.get('.cvat-object-item-button-keyframe-enabled').should('exist'); + }); + goCheckFrameNumber(frameNum + 2); + cy.get('#cvat_canvas_shape_3').should('exist').and('be.visible'); + cy.get('#cvat-objects-sidebar-state-item-3').should('contain', '3').and('contain', 'RECTANGLE TRACK').within(() => { + cy.get('.cvat-object-item-button-keyframe-enabled').should('exist'); + }); + }); + it('On the second frame and on the fourth frame the track is invisible', () => { + goCheckFrameNumber(frameNum + 1); + cy.get('#cvat_canvas_shape_3').should('exist').and('be.hidden'); + goCheckFrameNumber(frameNum + 3); + cy.get('#cvat_canvas_shape_3').should('exist').and('be.hidden'); + }); + it('Go to the second frame and remove "outside" flag from the track. The track now visible.', () => { + goCheckFrameNumber(frameNum + 1); + cy.get('#cvat-objects-sidebar-state-item-3').should('contain', '3').and('contain', 'RECTANGLE TRACK').within(() => { + cy.get('.cvat-object-item-button-outside').click(); + cy.get('.cvat-object-item-button-outside-enabled').should('not.exist'); + }); + cy.get('#cvat_canvas_shape_3').should('exist').and('be.visible'); + }); + it('Remove "keyframe" flag from the track. Track now interpolated between position on the first and the third frames.', () => { + cy.get('#cvat-objects-sidebar-state-item-3').should('contain', '3').and('contain', 'RECTANGLE TRACK').within(() => { + cy.get('.cvat-object-item-button-keyframe').click(); + cy.get('.cvat-object-item-button-keyframe-enabled').should('not.exist'); + }); + cy.get('#cvat_canvas_shape_3').should('have.attr', 'x').then(xCoords => { + // expected 9785 to be within 9642..9928 + expect(Math.floor(xCoords)).to.be.within(xCoordinatesObjectFirstFrame, xCoordinatesObjectThirdFrame); + }); + }); + it('On the fourth frame remove "keyframe" flag from the track. The track now visible and "outside" flag is disabled.', () => { + goCheckFrameNumber(frameNum + 3); + cy.get('#cvat-objects-sidebar-state-item-3').should('contain', '3').and('contain', 'RECTANGLE TRACK').within(() => { + cy.get('.cvat-object-item-button-keyframe').click(); + cy.get('.cvat-object-item-button-keyframe-enabled').should('not.exist'); + cy.get('.cvat-object-item-button-outside-enabled').should('not.exist'); + }); + cy.get('#cvat_canvas_shape_3').should('exist').and('be.visible'); + }); + it('Split a track with "split" button. Previous track became invisible (has "outside" flag). One more track and it is visible.', () => { + cy.get('.cvat-split-track-control').click(); + // A single click does not reproduce the split a track scenario in cypress test. + cy.get('#cvat_canvas_shape_3').click().click(); + cy.get('#cvat_canvas_shape_4').should('exist').and('be.hidden'); + cy.get('#cvat-objects-sidebar-state-item-4').should('contain', '4').and('contain', 'RECTANGLE TRACK').within(() => { + cy.get('.cvat-object-item-button-outside-enabled').should('exist'); + }); + cy.get('#cvat_canvas_shape_5').should('exist').and('be.visible'); + cy.get('#cvat-objects-sidebar-state-item-5').should('contain', '5').and('contain', 'RECTANGLE TRACK').within(() => { + cy.get('.cvat-object-item-button-outside-enabled').should('not.exist'); + cy.get('.cvat-object-item-button-keyframe-enabled').should('exist'); + }); + }); + }); +}); diff --git a/tests/cypress/integration/actions_tasks_objects/issue_1425_highlighted_attribute_correspond_chosen_attribute.js b/tests/cypress/integration/actions_tasks_objects/issue_1425_highlighted_attribute_correspond_chosen_attribute.js index 13926213..991f91d6 100644 --- a/tests/cypress/integration/actions_tasks_objects/issue_1425_highlighted_attribute_correspond_chosen_attribute.js +++ b/tests/cypress/integration/actions_tasks_objects/issue_1425_highlighted_attribute_correspond_chosen_attribute.js @@ -1,8 +1,6 @@ -/* - * Copyright (C) 2020 Intel Corporation - * - * SPDX-License-Identifier: MIT - */ +// Copyright (C) 2020 Intel Corporation +// +// SPDX-License-Identifier: MIT /// @@ -30,12 +28,7 @@ context('The highlighted attribute in AAM should correspond to the chosen attrib cy.createRectangle(createRectangleShape2Points); }); it('Go to AAM', () => { - cy.changeAnnotationMode('Attribute annotation'); - // Select the necessary label in any case - cy.get('.attribute-annotation-sidebar-basics-editor').within(() => { - cy.get('.ant-select-selection').click(); - }); - cy.get('.ant-select-dropdown-menu-item').contains(labelName).click(); + cy.changeWorkspace('Attribute annotation', labelName); }); it('Check if highlighted attribute correspond to the chosen attribute in right panel', () => { cy.get('.cvat_canvas_text').within(() => { diff --git a/tests/cypress/integration/actions_tasks_objects/issue_1540_add_remove_tag.js b/tests/cypress/integration/actions_tasks_objects/issue_1540_add_remove_tag.js index 3f5d83be..f5a402ad 100644 --- a/tests/cypress/integration/actions_tasks_objects/issue_1540_add_remove_tag.js +++ b/tests/cypress/integration/actions_tasks_objects/issue_1540_add_remove_tag.js @@ -17,11 +17,11 @@ context('Check if the UI not to crash after remove a tag', () => { describe(`Testing issue "${issueId}"`, () => { it('Add a tag', () => { - cy.changeAnnotationMode('Tag annotation'); + cy.changeWorkspace('Tag annotation'); cy.get('.cvat-tag-annotation-sidebar-buttons').within(() => { cy.get('button').contains('Add tag').click({ force: true }); }); - cy.changeAnnotationMode('Standard'); + cy.changeWorkspace('Standard'); }); it('Remove the tag', () => { cy.get('#cvat-objects-sidebar-state-item-1') diff --git a/tests/cypress/integration/actions_tasks_objects/issue_1750_err_aam_switch_frames.js b/tests/cypress/integration/actions_tasks_objects/issue_1750_err_aam_switch_frames.js index ee7652cd..150911ba 100644 --- a/tests/cypress/integration/actions_tasks_objects/issue_1750_err_aam_switch_frames.js +++ b/tests/cypress/integration/actions_tasks_objects/issue_1750_err_aam_switch_frames.js @@ -1,8 +1,6 @@ -/* - * Copyright (C) 2020 Intel Corporation - * - * SPDX-License-Identifier: MIT - */ +// Copyright (C) 2020 Intel Corporation +// +// SPDX-License-Identifier: MIT /// @@ -39,11 +37,7 @@ context('An error occurs in AAM when switching to 2 frames, if the frames have o cy.createRectangle(createRectangleShape2PointsSecond); }); it('Go to AAM', () => { - cy.get('.cvat-workspace-selector').click(); - cy.get('.ant-select-dropdown-menu-item') - .contains('Attribute annotation') - .click() - .should('contain.text', 'Attribute annotation'); + cy.changeWorkspace('Attribute annotation', labelName); }); it('Go to next frame', () => { cy.get('.cvat-player-next-button').click(); @@ -65,6 +59,7 @@ context('An error occurs in AAM when switching to 2 frames, if the frames have o }); it('Page with the error is missing', () => { cy.contains('Oops, something went wrong').should('not.exist'); + cy.changeLabelAAM(labelName); cy.get('.attribute-annotation-sidebar-object-switcher').should('contain', `${labelName} 2 [2/2]`); }); }); diff --git a/tests/cypress/plugins/index.js b/tests/cypress/plugins/index.js index 00a306e2..f1af3f8c 100644 --- a/tests/cypress/plugins/index.js +++ b/tests/cypress/plugins/index.js @@ -16,5 +16,13 @@ module.exports = (on, config) => { return null; }, }); + // Try to resolve "Cypress failed to make a connection to the Chrome DevTools Protocol" + // https://github.com/cypress-io/cypress/issues/7450 + on('before:browser:launch', (browser, launchOptions) => { + if (browser.name === 'chrome' && browser.isHeadless) { + launchOptions.args.push('--disable-gpu'); + return launchOptions + } + }); return config; }; diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index 889551c4..b81bfe72 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -1,8 +1,6 @@ -/* - * Copyright (C) 2020 Intel Corporation - * - * SPDX-License-Identifier: MIT - */ +// Copyright (C) 2020 Intel Corporation +// +// SPDX-License-Identifier: MIT /// @@ -124,10 +122,16 @@ Cypress.Commands.add('switchLabel', (labelName) => { }); Cypress.Commands.add('checkObjectParameters', (objectParameters, objectType) => { - cy.get('.cvat-objects-sidebar-state-item').then((objectSidebar) => { - cy.get(`#cvat_canvas_shape_${objectSidebar.length}`).should('exist').and('be.visible'); - cy.get(`#cvat-objects-sidebar-state-item-${objectSidebar.length}`) - .should('contain', objectSidebar.length).and('contain', `${objectType} ${objectParameters.type.toUpperCase()}`).within(() => { + let listCanvasShapeId = []; + cy.document().then((doc) => { + const listCanvasShape = Array.from(doc.querySelectorAll('.cvat_canvas_shape')); + for (let i = 0; i < listCanvasShape.length; i++) { + listCanvasShapeId.push(listCanvasShape[i].id.match(/\d+$/)); + } + const maxId = Math.max(...listCanvasShapeId); + cy.get(`#cvat_canvas_shape_${maxId}`).should('exist').and('be.visible'); + cy.get(`#cvat-objects-sidebar-state-item-${maxId}`) + .should('contain', maxId).and('contain', `${objectType} ${objectParameters.type.toUpperCase()}`).within(() => { cy.get('.ant-select-selection-selected-value').should('have.text', selectedValueGlobal); }); }); @@ -217,10 +221,23 @@ Cypress.Commands.add('closeSettings', () => { }); }); -Cypress.Commands.add('changeAnnotationMode', (mode) => { +Cypress.Commands.add('changeWorkspace', (mode, labelName) => { cy.get('.cvat-workspace-selector').click(); cy.get('.ant-select-dropdown-menu-item').contains(mode).click(); cy.get('.cvat-workspace-selector').should('contain.text', mode); + cy.changeLabelAAM(labelName); +}); + +Cypress.Commands.add('changeLabelAAM', (labelName) => { + cy.get('.cvat-workspace-selector').then((value) => { + const cvatWorkspaceSelectorValue = value.text(); + if (cvatWorkspaceSelectorValue === 'Attribute annotation') { + cy.get('.attribute-annotation-sidebar-basics-editor').within(() => { + cy.get('.ant-select-selection').click(); + }); + cy.get('.ant-select-dropdown-menu-item').contains(labelName).click(); + } + }); }); Cypress.Commands.add('createCuboid', (createCuboidParams) => {