Skip to content
This repository has been archived by the owner on Dec 7, 2021. It is now read-only.

Import region metadata from TFRecords #566

Merged
merged 135 commits into from
Feb 14, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
135 commits
Select commit Hold shift + click to select a range
6da5d99
WIP: Started refactoring canvas based assets
wbreza Feb 4, 2019
758e5f0
Wired up editor page for basic experience
wbreza Feb 5, 2019
7c5fe2c
WIP: Updated canvas to support single child element
wbreza Feb 6, 2019
ae60e84
Making progress
wbreza Feb 6, 2019
fe0112e
Got per frame tagging to work
wbreza Feb 7, 2019
0646987
Load and set child assets
wbreza Feb 7, 2019
e4f32c8
Updated to filter out child assets from displaying in side bar
wbreza Feb 7, 2019
8e38b91
Fixed issue with image regions now redrawing
wbreza Feb 7, 2019
4425c1e
Integrated next/previous tagged frame buttons
wbreza Feb 8, 2019
9f39294
Wabrez/video test coverage (#549)
wbreza Feb 8, 2019
2d663de
Canvas / Editor Page Test Coverage (#552)
wbreza Feb 9, 2019
cd6086e
Fixed issue instantiating canvas tools editor
wbreza Feb 9, 2019
98e260d
Wired up editor page for basic experience
wbreza Feb 5, 2019
29eaa00
WIP: Updated canvas to support single child element
wbreza Feb 6, 2019
752ebb0
Making progress
wbreza Feb 6, 2019
1ef80af
Wabrez/video test coverage (#549)
wbreza Feb 8, 2019
618e9d5
Load and set child assets
wbreza Feb 7, 2019
f2916b5
Update TFRecords functions
JacopoMangiavacchi Feb 6, 2019
c6ae7f2
WIP: Adding TFRecord Asset Preview
JacopoMangiavacchi Feb 6, 2019
059a20e
Loading Image from TFRecord file
JacopoMangiavacchi Feb 6, 2019
1489a10
Adding State to TFRecord asset component
JacopoMangiavacchi Feb 6, 2019
9ec1d23
Fix async read tfrecords attributes
JacopoMangiavacchi Feb 7, 2019
b598cff
Removed image ref on TFRecord asset
JacopoMangiavacchi Feb 7, 2019
2ab3c12
Ripristinated image ref in tfrecord asset
JacopoMangiavacchi Feb 7, 2019
af5c9db
Fix issues on render called before componentWillMount
JacopoMangiavacchi Feb 7, 2019
f92731c
Update state only if asset changes
JacopoMangiavacchi Feb 7, 2019
ebb1112
Moved tfrecordAsset to new folder
JacopoMangiavacchi Feb 8, 2019
3fa009f
WIP: Adding tfrecordAsset unit test
JacopoMangiavacchi Feb 9, 2019
b5cb9cc
Updated tfrecordAsset to last refactor changes
JacopoMangiavacchi Feb 9, 2019
c35bafe
Updated path
JacopoMangiavacchi Feb 9, 2019
83ed23d
Refactored based on last changes and removed duplicates
JacopoMangiavacchi Feb 9, 2019
3fa5e8e
added docs
JacopoMangiavacchi Feb 9, 2019
60e25e3
init state with property and removed constructor
JacopoMangiavacchi Feb 11, 2019
64f498c
Fixed unit test
JacopoMangiavacchi Feb 11, 2019
f627877
Added comments and localization
JacopoMangiavacchi Feb 12, 2019
c0de287
WIP: Started refactoring canvas based assets
wbreza Feb 4, 2019
fc12cbc
Wired up editor page for basic experience
wbreza Feb 5, 2019
967c3c1
WIP: Updated canvas to support single child element
wbreza Feb 6, 2019
7050bdd
Making progress
wbreza Feb 6, 2019
b987561
Got per frame tagging to work
wbreza Feb 7, 2019
6c8c433
Load and set child assets
wbreza Feb 7, 2019
b9495aa
Updated to filter out child assets from displaying in side bar
wbreza Feb 7, 2019
2ef3af3
Fixed issue with image regions now redrawing
wbreza Feb 7, 2019
f1b8d1c
Integrated next/previous tagged frame buttons
wbreza Feb 8, 2019
3de098b
Wabrez/video test coverage (#549)
wbreza Feb 8, 2019
00b01a6
Canvas / Editor Page Test Coverage (#552)
wbreza Feb 9, 2019
632d7dc
Fixed issue instantiating canvas tools editor
wbreza Feb 9, 2019
3d2f2c4
Making progress
wbreza Feb 6, 2019
59b7f6d
WIP: Adding TFRecord Asset Preview
JacopoMangiavacchi Feb 6, 2019
7045580
Wired up editor page for basic experience
wbreza Feb 5, 2019
59b7fc8
WIP: Updated canvas to support single child element
wbreza Feb 6, 2019
76da86c
WIP: Reading Region metadata from TFRecord
JacopoMangiavacchi Feb 8, 2019
70e94b9
Added Features Array capability to TFRecords Reader
JacopoMangiavacchi Feb 8, 2019
0562d60
Creating IRegion array
JacopoMangiavacchi Feb 8, 2019
1670d35
Adding Interface for TFRecord Object arrays
JacopoMangiavacchi Feb 8, 2019
7fad6f4
Fix TFRecord Object Array Interface
JacopoMangiavacchi Feb 9, 2019
5be23e7
Separated function for converting Region from TFRecord
JacopoMangiavacchi Feb 9, 2019
c5c0777
Replaced setTimeout() with setImmediate() in TFRecord asset test
JacopoMangiavacchi Feb 11, 2019
81eff56
Removed HEAD file created in rebase
JacopoMangiavacchi Feb 11, 2019
9b4b18c
Imported Tag name and color
JacopoMangiavacchi Feb 11, 2019
e4d218c
Test import metadata from tfrecord file
JacopoMangiavacchi Feb 11, 2019
ecc1474
Test region transformation
JacopoMangiavacchi Feb 12, 2019
c7d21e7
Fixed region bounding box calculus
JacopoMangiavacchi Feb 12, 2019
84eeb1c
Fixed TFRecords region width/height export
JacopoMangiavacchi Feb 12, 2019
eca3d17
Fixed code duplication in test
JacopoMangiavacchi Feb 12, 2019
305b6fb
Removed duplicated mock
JacopoMangiavacchi Feb 12, 2019
d8ecb2b
Fixed test error
JacopoMangiavacchi Feb 13, 2019
e689bcc
WIP: Started refactoring canvas based assets
wbreza Feb 4, 2019
23a8116
Wired up editor page for basic experience
wbreza Feb 5, 2019
df8449d
WIP: Updated canvas to support single child element
wbreza Feb 6, 2019
96115d3
Making progress
wbreza Feb 6, 2019
bb3c90d
Got per frame tagging to work
wbreza Feb 7, 2019
b351c5c
Load and set child assets
wbreza Feb 7, 2019
f21cd59
Updated to filter out child assets from displaying in side bar
wbreza Feb 7, 2019
f340047
Fixed issue with image regions now redrawing
wbreza Feb 7, 2019
65a178a
Integrated next/previous tagged frame buttons
wbreza Feb 8, 2019
94ca075
Wabrez/video test coverage (#549)
wbreza Feb 8, 2019
a3f4d77
Canvas / Editor Page Test Coverage (#552)
wbreza Feb 9, 2019
9b0cc73
Fixed issue instantiating canvas tools editor
wbreza Feb 9, 2019
f42e442
Wired up editor page for basic experience
wbreza Feb 5, 2019
a2cdc05
WIP: Updated canvas to support single child element
wbreza Feb 6, 2019
782cba6
Making progress
wbreza Feb 6, 2019
936937d
Wabrez/video test coverage (#549)
wbreza Feb 8, 2019
16b92b8
Load and set child assets
wbreza Feb 7, 2019
aca9245
Update TFRecords functions
JacopoMangiavacchi Feb 6, 2019
f260711
Add TFRecord new asset type changes
JacopoMangiavacchi Feb 6, 2019
c2a4228
WIP: Adding TFRecord Asset Preview
JacopoMangiavacchi Feb 6, 2019
c9f852d
Loading Image from TFRecord file
JacopoMangiavacchi Feb 6, 2019
582af88
Adding State to TFRecord asset component
JacopoMangiavacchi Feb 6, 2019
5ccf072
Fix async read tfrecords attributes
JacopoMangiavacchi Feb 7, 2019
ef6d616
Removed image ref on TFRecord asset
JacopoMangiavacchi Feb 7, 2019
46ad910
Ripristinated image ref in tfrecord asset
JacopoMangiavacchi Feb 7, 2019
93688ac
Fix issues on render called before componentWillMount
JacopoMangiavacchi Feb 7, 2019
3746999
Update state only if asset changes
JacopoMangiavacchi Feb 7, 2019
52b609b
Moved tfrecordAsset to new folder
JacopoMangiavacchi Feb 8, 2019
c8b36c0
WIP: Adding tfrecordAsset unit test
JacopoMangiavacchi Feb 9, 2019
ea12c9a
Updated tfrecordAsset to last refactor changes
JacopoMangiavacchi Feb 9, 2019
ec3d7db
Updated path
JacopoMangiavacchi Feb 9, 2019
f6cd9ed
Refactored based on last changes and removed duplicates
JacopoMangiavacchi Feb 9, 2019
d250cc6
added docs
JacopoMangiavacchi Feb 9, 2019
1f621a5
init state with property and removed constructor
JacopoMangiavacchi Feb 11, 2019
b81ee74
Fixed unit test
JacopoMangiavacchi Feb 11, 2019
0352d3e
Removed ~HEAD files created by rebase
JacopoMangiavacchi Feb 11, 2019
7cd3db7
Added comments and localization
JacopoMangiavacchi Feb 12, 2019
8e9dc3e
WIP: Started refactoring canvas based assets
wbreza Feb 4, 2019
fc210c6
Wired up editor page for basic experience
wbreza Feb 5, 2019
fbf8350
WIP: Updated canvas to support single child element
wbreza Feb 6, 2019
ae31eb0
Making progress
wbreza Feb 6, 2019
e8b707d
Got per frame tagging to work
wbreza Feb 7, 2019
27f5510
Load and set child assets
wbreza Feb 7, 2019
3dac0bc
Updated to filter out child assets from displaying in side bar
wbreza Feb 7, 2019
d835351
Fixed issue with image regions now redrawing
wbreza Feb 7, 2019
c5b53df
Integrated next/previous tagged frame buttons
wbreza Feb 8, 2019
0508935
Wabrez/video test coverage (#549)
wbreza Feb 8, 2019
e4bea0d
Canvas / Editor Page Test Coverage (#552)
wbreza Feb 9, 2019
a17156e
Fixed issue instantiating canvas tools editor
wbreza Feb 9, 2019
e719373
Making progress
wbreza Feb 6, 2019
287a40a
WIP: Adding TFRecord Asset Preview
JacopoMangiavacchi Feb 6, 2019
6b41557
Wired up editor page for basic experience
wbreza Feb 5, 2019
75f1235
WIP: Updated canvas to support single child element
wbreza Feb 6, 2019
160b1bf
WIP: Reading Region metadata from TFRecord
JacopoMangiavacchi Feb 8, 2019
533f54a
Creating IRegion array
JacopoMangiavacchi Feb 8, 2019
60a9fb6
Fix TFRecord Object Array Interface
JacopoMangiavacchi Feb 9, 2019
6b0360a
Replaced setTimeout() with setImmediate() in TFRecord asset test
JacopoMangiavacchi Feb 11, 2019
c3a38e1
Removed HEAD file created in rebase
JacopoMangiavacchi Feb 11, 2019
16c3c0a
Fixed code duplication in test
JacopoMangiavacchi Feb 12, 2019
1887dd5
Resolved some PR feedback
JacopoMangiavacchi Feb 13, 2019
a1f1910
Fixed import regions test
JacopoMangiavacchi Feb 13, 2019
e859c1f
temporary comment some code
JacopoMangiavacchi Feb 13, 2019
ca74465
Removed comments from previous commit
JacopoMangiavacchi Feb 13, 2019
22f26b7
Moved ITFRecordMetadata interface to applicationState
JacopoMangiavacchi Feb 13, 2019
6e8ae57
Fixed SonarCloud issue
JacopoMangiavacchi Feb 13, 2019
ea0fe3c
Removed duplicated test
JacopoMangiavacchi Feb 13, 2019
66b79a9
Removed empty prop interfaces
JacopoMangiavacchi Feb 13, 2019
0ea43d0
Addressed feedback from PR
JacopoMangiavacchi Feb 14, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Wabrez/video test coverage (#549)
* Added unit tests for custom video player button

* Added unit tests for image asset component

* Added unit tests for video asset component
  • Loading branch information
wbreza authored and JacopoMangiavacchi committed Feb 13, 2019
commit 9f392945462ba26d9f06582f07cbac14108c3bd3
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from "react";
import { IAsset, AssetType } from "../../../../models/applicationState";
import { strings } from "../../../../common/strings";
import { IAsset, AssetType } from "../../../models/applicationState";
import { strings } from "../../../common/strings";
import { ImageAsset } from "./imageAsset";
import { VideoAsset } from "./videoAsset";

Expand Down
68 changes: 68 additions & 0 deletions src/react/components/assetPreview/imageAsset.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import React from "react";
import { IAssetProps } from "./assetPreview";
import { ReactWrapper, mount } from "enzyme";
import { ImageAsset } from "./imageAsset";
import MockFactory from "../../../common/mockFactory";

describe("Image Asset Component", () => {
// tslint:disable-next-line:max-line-length
const dataUri = "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7";
let wrapper: ReactWrapper<IAssetProps> = null;
const onLoadHandler = jest.fn();
MockFactory.createTestAsset("test");
const defaultProps: IAssetProps = {
asset: {
...MockFactory.createTestAsset("test"),
path: dataUri,
},
onLoaded: onLoadHandler,
};

function createComponent(props?: IAssetProps): ReactWrapper<IAssetProps> {
props = props || defaultProps;
return mount(<ImageAsset {...props} />);
}

it("renders landscape image correctly", () => {
const props = { ...defaultProps };
props.asset.size = {
width: 800,
height: 600,
};

wrapper = createComponent(props);
const img = wrapper.find("img");

expect(img.exists()).toBe(true);
expect(img.props()).toEqual(expect.objectContaining({
className: "landscape",
src: defaultProps.asset.path,
}));
});

it("renders portrait image correctly", () => {
const props = { ...defaultProps };
props.asset.size = {
width: 600,
height: 800,
};

wrapper = createComponent(props);
const img = wrapper.find("img");

expect(img.exists()).toBe(true);
expect(img.props()).toEqual(expect.objectContaining({
className: "portrait",
src: defaultProps.asset.path,
}));
});

it("raises onLoad handler when image has completed loading", () => {
wrapper = createComponent();

const img = wrapper.find("img").getDOMNode() as HTMLImageElement;
img.dispatchEvent(new Event("load"));

expect(onLoadHandler).toBeCalledWith(expect.any(HTMLImageElement));
});
});
222 changes: 222 additions & 0 deletions src/react/components/assetPreview/videoAsset.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
import React from "react";
import { ReactWrapper, mount } from "enzyme";
import { IVideoAssetProps, VideoAsset, IVideoPlayerState, IVideoAssetState } from "./videoAsset";
import MockFactory from "../../../common/mockFactory";
import { CustomVideoPlayerButton } from "../common/videoPlayer/customVideoPlayerButton";

import { Player } from "video-react";
import { AssetType, AssetState } from "../../../models/applicationState";

describe("Video Asset Component", () => {
let wrapper: ReactWrapper<IVideoAssetProps, IVideoAssetState> = null;
let onVideoStateChangeHandler: (state: Readonly<IVideoPlayerState>, prev: Readonly<IVideoPlayerState>) => void;
const videoPlayerMock = Player as jest.Mocked<typeof Player>;
const onLoadedHandler = jest.fn();
const onActivatedHandler = jest.fn();
const onDeactivatedHandler = jest.fn();
const onChildSelectedHandler = jest.fn();
const defaultProps: IVideoAssetProps = {
asset: MockFactory.createVideoTestAsset("test-video"),
autoPlay: false,
onLoaded: onLoadedHandler,
onActivated: onActivatedHandler,
onDeactivated: onDeactivatedHandler,
onChildAssetSelected: onChildSelectedHandler,
};

beforeEach(() => {
videoPlayerMock.prototype.subscribeToStateChange = jest.fn((handler) => onVideoStateChangeHandler = handler);
videoPlayerMock.prototype.pause = jest.fn();
videoPlayerMock.prototype.seek = jest.fn((timestamp) => {
mockPaused(timestamp);
});
});

function createComponent(props?: IVideoAssetProps): ReactWrapper<IVideoAssetProps, IVideoAssetState> {
props = props || defaultProps;

return mount(<VideoAsset {...props} />);
}

it("renders correctly", () => {
wrapper = createComponent();

expect(wrapper.find(Player).exists()).toBe(true);
expect(wrapper.find(CustomVideoPlayerButton).length).toEqual(2);
});

it("resets loaded state when asset changes", () => {
wrapper = createComponent();
mockLoaded();

const newAsset = MockFactory.createVideoTestAsset("new-video-asset");
wrapper.setProps({ asset: newAsset });
expect(wrapper.state().loaded).toBe(false);
});

it("seeks the video player to the spcified timestamp when timestamp changes", () => {
const expectedTime = 10.2;
wrapper = createComponent();
mockLoaded();

wrapper.setProps({ timestamp: expectedTime });
expect(videoPlayerMock.prototype.seek).toBeCalledWith(expectedTime);
});

it("moves to the next tagged frame when clicking the next button", () => {
const childAssets = MockFactory.createChildVideoAssets(defaultProps.asset);
const currentAsset = childAssets[0];
const expectedAsset = {
...childAssets[1],
state: AssetState.Visited,
};

videoPlayerMock.prototype.getState = jest.fn(() => {
return {
player: {
currentTime: currentAsset.timestamp,
},
};
});

const props: IVideoAssetProps = {
...defaultProps,
childAssets: childAssets,
timestamp: currentAsset.timestamp,
};

wrapper = createComponent(props);
mockLoaded();

wrapper.find(CustomVideoPlayerButton).at(1).simulate("click");

expect(videoPlayerMock.prototype.pause).toBeCalled();
expect(videoPlayerMock.prototype.seek).toBeCalledWith(expectedAsset.timestamp);
expect(onChildSelectedHandler).toBeCalledWith(expectedAsset);
});

it("moves to the previous tagged frame when clicking the back button", () => {
const childAssets = MockFactory.createChildVideoAssets(defaultProps.asset);
const currentAsset = childAssets[4];
const expectedAsset = {
...childAssets[3],
state: AssetState.Visited,
};

videoPlayerMock.prototype.getState = jest.fn(() => {
return {
player: {
currentTime: currentAsset.timestamp,
},
};
});

const props: IVideoAssetProps = {
...defaultProps,
childAssets: childAssets,
timestamp: currentAsset.timestamp,
};

wrapper = createComponent(props);
mockLoaded();

wrapper.find(CustomVideoPlayerButton).at(0).simulate("click");

expect(videoPlayerMock.prototype.pause).toBeCalled();
expect(videoPlayerMock.prototype.seek).toBeCalledWith(expectedAsset.timestamp);
expect(onChildSelectedHandler).toBeCalledWith(expectedAsset);
});

it("raises the onLoad and activated handlers when the video has been loaded", () => {
wrapper = createComponent();
mockLoaded();

expect(onLoadedHandler).toBeCalledWith(expect.any(HTMLVideoElement));
expect(onActivatedHandler).toBeCalledWith(expect.any(HTMLVideoElement));
expect(wrapper.state().loaded).toBe(true);
});

it("raises the child asset selected and deactivated handlers when the video is paused", () => {
const expectedTime = 10.5;
wrapper = createComponent();
mockLoaded();
mockPaused(expectedTime);

expect(onDeactivatedHandler).toBeCalledWith(expect.any(HTMLVideoElement));
expect(onChildSelectedHandler).toBeCalledWith(expect.objectContaining({
type: AssetType.VideoFrame,
path: `${defaultProps.asset.path}#t=${expectedTime}`,
timestamp: expectedTime,
parent: defaultProps.asset,
}));
});

it("raises the activated handler when the video resumes", () => {
wrapper = createComponent();
mockLoaded();
mockPaused(4.0);

onLoadedHandler.mockReset();
onDeactivatedHandler.mockReset();

mockResume();

expect(onLoadedHandler).not.toBeCalled();
expect(onDeactivatedHandler).not.toBeCalled();
expect(onActivatedHandler).toBeCalledWith(expect.any(HTMLVideoElement));
});

function mockLoaded() {
const state: IVideoPlayerState = {
readyState: 4,
paused: false,
currentTime: 0,
seeking: false,
};

const prev: IVideoPlayerState = {
readyState: 1,
paused: false,
currentTime: 0,
seeking: false,
};

onVideoStateChangeHandler(state, prev);
}

function mockPaused(currentTime: number) {
const state: IVideoPlayerState = {
readyState: 4,
paused: true,
currentTime,
seeking: false,
};

const prev: IVideoPlayerState = {
readyState: 4,
paused: false,
currentTime: 2.0,
seeking: true,
};

onVideoStateChangeHandler(state, prev);
}

function mockResume() {
const state: IVideoPlayerState = {
readyState: 4,
paused: false,
currentTime: 0,
seeking: false,
};

const prev: IVideoPlayerState = {
readyState: 4,
paused: true,
currentTime: 0,
seeking: false,
};

onVideoStateChangeHandler(state, prev);
}
});
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import {
TimeDivider, PlaybackRateMenuButton, VolumeMenuButton,
} from "video-react";
import { IAssetProps } from "./assetPreview";
import { IAsset, AssetType, AssetState } from "../../../../models/applicationState";
import { AssetService } from "../../../../services/assetService";
import { CustomVideoPlayerButton } from "../../common/videoPlayer/customVideoPlayerButton";
import { IAsset, AssetType, AssetState } from "../../../models/applicationState";
import { AssetService } from "../../../services/assetService";
import { CustomVideoPlayerButton } from "../common/videoPlayer/customVideoPlayerButton";

export interface IVideoAssetProps extends IAssetProps, React.Props<VideoAsset> {
autoPlay?: boolean;
Expand Down Expand Up @@ -156,6 +156,7 @@ export class VideoAsset extends React.Component<IVideoAssetProps> {
const parentAsset = this.props.asset.parent || this.props.asset;
const childPath = `${parentAsset.path}#t=${state.currentTime}`;
const childAsset = AssetService.createAssetFromFilePath(childPath);
childAsset.state = AssetState.Visited;
childAsset.type = AssetType.VideoFrame;
childAsset.parent = parentAsset;
childAsset.timestamp = state.currentTime;
Expand Down