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) => {