terminal/src/til/ut_til/OperatorTests.cpp
Michael Niksa ca33d895a3
Move ConPTY to use til::bitmap (#5024)
## Summary of the Pull Request
Moves the ConPTY drawing mechanism (`VtRenderer`) to use the fine-grained `til::bitmap` individual-dirty-bit tracking mechanism instead of coarse-grained rectangle unions to improve drawing performance by dramatically reducing the total area redrawn.

## PR Checklist
* [x] Part of #778 and #1064 
* [x] I work here
* [x] Tests added and updated.
* [x] I'm a core contributor

## Detailed Description of the Pull Request / Additional comments
- Converted `GetDirtyArea()` interface from `IRenderEngine` to use a vector of `til::rectangle` instead of the `SMALL_RECT` to banhammer inclusive rectangles.
- `VtEngine` now holds and operates on the `til::bitmap` for invalidation regions. All invalidation operation functions that used to be embedded inside `VtEngine` are deleted in favor of using the ones in `til::bitmap`.
- Updated `VtEngine` tracing to use new `til::bitmap` on trace and the new `to_string()` methods detailed below.
- Comparison operators for `til::bitmap` and complementary tests.
- Fixed an issue where the dirty rectangle shortcut in `til::bitmap` was set to 0,0,0,0 by default which means that `|=` on it with each `set()` operation was stretching the rectangle from 0,0. Now it's a `std::optional` so it has no value after just being cleared and will build from whatever the first invalidated rectangle is. Complementary tests added.
- Optional run caching for `til::bitmap` in the `runs()` method since both VT and DX renderers will likely want to generate the set of runs at the beginning of a frame and refer to them over and over through that frame. Saves the iteration and creation and caches inside `til::bitmap` where the chance of invalidation of the underlying data is known best. It is still possible to iterate manually with `begin()` and `end()` from the outside without caching, if desired. Complementary tests added.
- WEX templates added for `til::bitmap` and used in tests.
- `translate()` method for `til::bitmap` which will slide the dirty points in the direction specified by a `til::point` and optionally back-fill the uncovered area as dirty. Complementary tests added.
- Moves all string generation for `til` types `size`, `point`, `rectangle`, and `some` into a `to_string` method on each object such that it can be used in both ETW tracing scenarios AND in the TAEF templates uniformly. Adds a similar method for `bitmap`.
- Add tagging to `_bitmap_const_iterator` such that it appears as a valid **Input Iterator** to STL collections and can be used in a `std::vector` constructor as a range. Adds and cleans up operators on this iterator to match the theoretical requirements for an **Input Iterator**. Complementary tests added.
- Add loose operators to `til` which will allow some basic math operations (+, -, *, /) between `til::size` and `til::point` and vice versa. Complementary tests added. Complementary tests added.
- Adds operators to `til::rectangle` to allow scaling with basic math operations (+, -, *) versus `til::size` and translation with basic math operations (+, -) against `til::point`. Complementary tests added.
- In-place variants of some operations added to assorted `til` objects. Complementary tests added.
- Update VT tests to compare invalidation against the new map structure instead of raw rectangles where possible.

## Validation Steps Performed
- Wrote additional til Unit Tests for all additional operators and functions added to the project to support this operation
- Updated the existing VT renderer tests
- Ran perf check
2020-03-23 15:57:54 +00:00

88 lines
2.3 KiB
C++

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include "precomp.h"
#include "til/operators.h"
using namespace WEX::Common;
using namespace WEX::Logging;
using namespace WEX::TestExecution;
class OperatorTests
{
TEST_CLASS(OperatorTests);
TEST_METHOD(PointAddSize)
{
const til::point pt{ 5, 10 };
const til::size sz{ 2, 4 };
const til::point expected{ 5 + 2, 10 + 4 };
const auto actual = pt + sz;
VERIFY_ARE_EQUAL(expected, actual);
}
TEST_METHOD(PointSubSize)
{
const til::point pt{ 5, 10 };
const til::size sz{ 2, 4 };
const til::point expected{ 5 - 2, 10 - 4 };
const auto actual = pt - sz;
VERIFY_ARE_EQUAL(expected, actual);
}
TEST_METHOD(PointMulSize)
{
const til::point pt{ 5, 10 };
const til::size sz{ 2, 4 };
const til::point expected{ 5 * 2, 10 * 4 };
const auto actual = pt * sz;
VERIFY_ARE_EQUAL(expected, actual);
}
TEST_METHOD(PointDivSize)
{
const til::point pt{ 5, 10 };
const til::size sz{ 2, 4 };
const til::point expected{ 5 / 2, 10 / 4 };
const auto actual = pt / sz;
VERIFY_ARE_EQUAL(expected, actual);
}
TEST_METHOD(SizeAddPoint)
{
const til::size pt{ 5, 10 };
const til::point sz{ 2, 4 };
const til::size expected{ 5 + 2, 10 + 4 };
const auto actual = pt + sz;
VERIFY_ARE_EQUAL(expected, actual);
}
TEST_METHOD(SizeSubPoint)
{
const til::size pt{ 5, 10 };
const til::point sz{ 2, 4 };
const til::size expected{ 5 - 2, 10 - 4 };
const auto actual = pt - sz;
VERIFY_ARE_EQUAL(expected, actual);
}
TEST_METHOD(SizeMulPoint)
{
const til::size pt{ 5, 10 };
const til::point sz{ 2, 4 };
const til::size expected{ 5 * 2, 10 * 4 };
const auto actual = pt * sz;
VERIFY_ARE_EQUAL(expected, actual);
}
TEST_METHOD(SizeDivPoint)
{
const til::size pt{ 5, 10 };
const til::point sz{ 2, 4 };
const til::size expected{ 5 / 2, 10 / 4 };
const auto actual = pt / sz;
VERIFY_ARE_EQUAL(expected, actual);
}
};