blob: 436e6ad05a7feab4ba171483d1ddfe2dcfd71af4 [file] [log] [blame]
#!/usr/bin/env ruby
# cd folly/futures/test && ruby then_compile_test.rb > ThenCompileTest.cpp
# An exercise in combinatorics.
# (ordinary/static function, member function, std::function, lambda)
# X
# returns (Future<R>, R)
# X
# accepts (Try<T>&&, Try<T> const&, Try<T>, T&&, T const&, T, nothing)
def test(*args)
args = args.join(", ")
[
"{Future<B> f = someFuture<A>().then(#{args});}",
#"{Future<B> f = makeFuture(A()).then(#{args}, anExecutor);}",
]
end
def retval(ret)
{
"Future<B>" => "someFuture<B>()",
"Try<B>" => "Try<B>(B())",
"B" => "B()"
}[ret]
end
return_types = [
"Future<B>",
"B",
#"Try<B>",
]
param_types = [
"Try<A>&&",
"Try<A> const&",
"Try<A>",
"Try<A>&",
"A&&",
"A const&",
"A",
"A&",
"",
]
tests = (
return_types.map { |ret|
param_types.map { |param|
if param != "" then
both = "#{ret}, #{param}"
[
["&aFunction<#{both}>"],
["&SomeClass::aStaticMethod<#{both}>"],
["&SomeClass::aMethod<#{both}>", "&anObject"],
["aStdFunction<#{both}>()"],
["[&](#{param}){return #{retval(ret)};}"],
]
else
[["[&](){return #{retval(ret)};}"]]
end
}
}.flatten(2)
).map {|a| test(a)}.flatten
print <<EOF
// This file is #{"@"}generated by then_compile_test.rb. Do not edit directly.
#include <folly/futures/test/ThenCompileTest.h>
using namespace folly;
TEST(Basic, thenVariants) {
SomeClass anObject;
#{tests.join("\n ")}
}
EOF