1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/dom/custom/CustomElementReactionQueue.h"
#include "core/dom/custom/CustomElementReaction.h"
#include "core/dom/custom/CustomElementReactionTestHelpers.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "wtf/Functional.h"
#include <initializer_list>
#include <vector>
namespace blink {
TEST(CustomElementReactionQueueTest, invokeReactions_one) {
std::vector<char> log;
CustomElementReactionQueue* queue = new CustomElementReactionQueue();
queue->add(new TestReaction({new Log('a', log)}));
queue->invokeReactions(nullptr);
EXPECT_EQ(log, std::vector<char>({'a'}))
<< "the reaction should have been invoked";
}
TEST(CustomElementReactionQueueTest, invokeReactions_many) {
std::vector<char> log;
CustomElementReactionQueue* queue = new CustomElementReactionQueue();
queue->add(new TestReaction({new Log('a', log)}));
queue->add(new TestReaction({new Log('b', log)}));
queue->add(new TestReaction({new Log('c', log)}));
queue->invokeReactions(nullptr);
EXPECT_EQ(log, std::vector<char>({'a', 'b', 'c'}))
<< "the reaction should have been invoked";
}
TEST(CustomElementReactionQueueTest, invokeReactions_recursive) {
std::vector<char> log;
CustomElementReactionQueue* queue = new CustomElementReactionQueue();
CustomElementReaction* third = new TestReaction(
{new Log('c', log), new Recurse(queue)}); // "Empty" recursion
CustomElementReaction* second = new TestReaction(
{new Log('b', log),
new Enqueue(queue, third)}); // Unwinds one level of recursion
CustomElementReaction* first =
new TestReaction({new Log('a', log), new Enqueue(queue, second),
new Recurse(queue)}); // Non-empty recursion
queue->add(first);
queue->invokeReactions(nullptr);
EXPECT_EQ(log, std::vector<char>({'a', 'b', 'c'}))
<< "the reactions should have been invoked";
}
TEST(CustomElementReactionQueueTest, clear_duringInvoke) {
std::vector<char> log;
CustomElementReactionQueue* queue = new CustomElementReactionQueue();
queue->add(new TestReaction({new Log('a', log)}));
queue->add(new TestReaction({new Call(WTF::bind(
[](CustomElementReactionQueue* queue, Element*) { queue->clear(); },
wrapPersistent(queue)))}));
queue->add(new TestReaction({new Log('b', log)}));
queue->invokeReactions(nullptr);
EXPECT_EQ(log, std::vector<char>({'a'}))
<< "only 'a' should be logged; the second log should have been cleared";
}
} // namespace blink
|