Files
oak-editor/tests/gtest/timebased_widget_test.cpp
T
Mike-Solar 66d761b4b7 R8: finish app/ pure C ABI migration (P3-P9) and make OTIO required
- app/ no longer includes engine C++ headers nor holds engine C++ types:
  engine access goes through the oakengine C ABI plus C++ wrappers
  (oakutil/oaknode.h, oakutil/oakvideo.h) and app-local mirror types
  (tooltypes, trackreferencehandle, timelinecommonapp, keyframetypes,
  subtitleapp, serializedlayoutinfoapp, nodevaluehandle, sliderdisplaytypeapp)
- engine: new C ABI functions for block/track/clip/transition navigation
  and predicates, links, caches, waveform/playback, disk folder,
  sequence_track_list, node_free, footage_is_valid, block_get_track,
  get_brush; loadotio/saveotio ported to the current engine API
- OTIO is now a required dependency: CI and CD build it on every
  platform, FindOpenTimelineIO fixed for OTIO 0.16/0.19 (the old deps
  include requirement silently disabled OTIO everywhere), runtime
  libraries are bundled into packages and copied next to macOS binaries
  (oak_copy_otio_runtime)
- fix ProjectViewModel drag&drop mime read/write size mismatch (segfault)
- unify color label naming (k_olive -> "Oak") in the app-side mirror
- docs: OTIO required, FFmpeg minimum corrected to 6.0 (en/zh)
- gtest suite: 1925 passed, 0 failed
2026-07-31 22:46:52 +08:00

84 lines
2.5 KiB
C++

#include <gtest/gtest.h>
#include "widget/timebased/timebasedwidget.h"
#include "widget/timeruler/seekablewidget.h"
#include "node/output/viewer/viewer.h"
TEST(TimeBasedWidget, ConnectViewerNodeNullSafe)
{
olive::TimeBasedWidget widget(false, false);
widget.connect_viewer_node(nullptr);
EXPECT_EQ(widget.get_connected_node(), nullptr);
}
TEST(TimeBasedWidget, ConnectedNodeClearsOnDelete)
{
olive::TimeBasedWidget widget(false, false);
auto *viewer = new olive::ViewerOutput();
widget.connect_viewer_node(reinterpret_cast<OakEngineNode *>(viewer));
EXPECT_EQ(widget.get_connected_node(), reinterpret_cast<OakEngineNode *>(viewer));
delete viewer;
EXPECT_EQ(widget.get_connected_node(), nullptr);
}
TEST(SeekableWidget, ConstructionInitializesDefaults)
{
olive::SeekableWidget widget;
EXPECT_FALSE(widget.is_dragging_playhead());
EXPECT_FALSE(widget.has_items_selected());
EXPECT_EQ(widget.get_markers(), nullptr);
EXPECT_EQ(widget.get_work_area(), nullptr);
}
TEST(SeekableWidget, SetScrollAdjustsScrollBar)
{
olive::SeekableWidget widget;
widget.resize(400, 100);
widget.set_scroll(0);
EXPECT_EQ(widget.get_scroll(), 0);
// Give the scene a deterministic length much wider than the viewport so
// the horizontal scrollbar gains a non-zero range (60 seconds at
// 100 px/second)
widget.set_timebase(olive::Rational(1, 30));
widget.set_scale(100.0);
widget.set_end_time(olive::Rational(60));
const int max_scroll = widget.horizontalScrollBar()->maximum();
ASSERT_GT(max_scroll, 0);
widget.set_scroll(max_scroll);
EXPECT_EQ(widget.get_scroll(), max_scroll);
// Values beyond the range clamp to the scrollbar's maximum
widget.set_scroll(max_scroll + 1000);
EXPECT_EQ(widget.get_scroll(), max_scroll);
}
TEST(SeekableWidget, SetMarkersAndWorkAreaAreReflected)
{
olive::SeekableWidget widget;
olive::TimelineMarkerList markers;
olive::TimelineWorkArea workarea;
widget.set_markers(reinterpret_cast<OakEngineMarkerList *>(&markers));
widget.set_work_area(reinterpret_cast<OakEngineWorkarea *>(&workarea));
EXPECT_EQ(widget.get_markers(), reinterpret_cast<OakEngineMarkerList *>(&markers));
EXPECT_EQ(widget.get_work_area(), reinterpret_cast<OakEngineWorkarea *>(&workarea));
}
TEST(SeekableWidget, MarkerEditingEnabledToggles)
{
olive::SeekableWidget widget;
EXPECT_TRUE(widget.is_marker_editing_enabled());
widget.set_marker_editing_enabled(false);
EXPECT_FALSE(widget.is_marker_editing_enabled());
widget.set_marker_editing_enabled(true);
EXPECT_TRUE(widget.is_marker_editing_enabled());
}