salsa/tests/incremental/implementation.rs
Fabian Schuiki 93c30a953d make query_group macro procedural
Switch to a procedural implementation of the `query_group!` macro,
residing in the `components/salsa_macros` subcrate.

Allow the user to override the invoked function via `salsa::invoke(...)`
and the name of the generated query type via `salsa::query_type(...)`.

In all tests, replace the `salsa::query_group! { ... }` invocations with
the new attribute-style `#[salsa::query_group]` macro, and change them
to the new naming scheme for query types (`...Query`).

Update README, examples, and documentation.
2019-01-17 07:24:18 +01:00

85 lines
2.5 KiB
Rust

use crate::constants;
use crate::counter::Counter;
use crate::log::Log;
use crate::memoized_dep_inputs;
use crate::memoized_inputs;
use crate::memoized_volatile;
pub(crate) trait TestContext: salsa::Database {
fn clock(&self) -> &Counter;
fn log(&self) -> &Log;
}
#[derive(Default)]
pub(crate) struct TestContextImpl {
runtime: salsa::Runtime<TestContextImpl>,
clock: Counter,
log: Log,
}
impl TestContextImpl {
pub(crate) fn assert_log(&self, expected_log: &[&str]) {
let expected_text = &format!("{:#?}", expected_log);
let actual_text = &format!("{:#?}", self.log().take());
if expected_text == actual_text {
return;
}
for diff in diff::lines(expected_text, actual_text) {
match diff {
diff::Result::Left(l) => println!("-{}", l),
diff::Result::Both(l, _) => println!(" {}", l),
diff::Result::Right(r) => println!("+{}", r),
}
}
panic!("incorrect log results");
}
}
salsa::database_storage! {
pub(crate) struct TestContextImplStorage for TestContextImpl {
impl constants::ConstantsDatabase {
fn constants_input() for constants::ConstantsInputQuery;
fn constants_derived() for constants::ConstantsAddQuery;
}
impl memoized_dep_inputs::MemoizedDepInputsContext {
fn dep_memoized2() for memoized_dep_inputs::DepMemoized2Query;
fn dep_memoized1() for memoized_dep_inputs::DepMemoized1Query;
fn dep_derived1() for memoized_dep_inputs::DepDerived1Query;
fn dep_input1() for memoized_dep_inputs::DepInput1Query;
fn dep_input2() for memoized_dep_inputs::DepInput2Query;
}
impl memoized_inputs::MemoizedInputsContext {
fn max() for memoized_inputs::MaxQuery;
fn input1() for memoized_inputs::Input1Query;
fn input2() for memoized_inputs::Input2Query;
}
impl memoized_volatile::MemoizedVolatileContext {
fn memoized2() for memoized_volatile::Memoized2Query;
fn memoized1() for memoized_volatile::Memoized1Query;
fn volatile() for memoized_volatile::VolatileQuery;
}
}
}
impl TestContext for TestContextImpl {
fn clock(&self) -> &Counter {
&self.clock
}
fn log(&self) -> &Log {
&self.log
}
}
impl salsa::Database for TestContextImpl {
fn salsa_runtime(&self) -> &salsa::Runtime<TestContextImpl> {
&self.runtime
}
}