blob: d2c97a1467b7a288a972e336dbc1c41f9849b061 [file] [log] [blame] [edit]
/*
* Copyright (c) 2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "AST.h"
#include "ParserPrivate.h"
#include "WGSLShaderModule.h"
#include <wtf/DataLog.h>
static Expected<std::pair<WGSL::ShaderModule, WGSL::AST::Expression::Ref>, WGSL::Error> parseLCharPrimaryExpression(const String& input)
{
WGSL::ShaderModule shaderModule(input, { });
WGSL::Lexer lexer(input.span<Latin1Character>());
WGSL::Parser parser(shaderModule, lexer);
auto expression = parser.parsePrimaryExpression();
if (!expression)
return makeUnexpected(expression.error());
return { std::make_pair(WTF::move(shaderModule), *expression) };
}
template<class NumberType>
struct ConstLiteralTestCase {
String input;
NumberType expectedValue;
};
namespace TestWGSLAPI {
TEST(WGSLConstLiteralTests, BoolLiteral)
{
using namespace WGSL;
const ConstLiteralTestCase<bool> testCases[] = {
{ "true"_s, true },
{ "false"_s, false }
};
for (const auto& testCase : testCases) {
auto parseResult = parseLCharPrimaryExpression(testCase.input);
EXPECT_TRUE(parseResult);
AST::Expression& expr = parseResult->second;
EXPECT_TRUE(is<AST::BoolLiteral>(expr));
const auto& intLiteral = downcast<AST::BoolLiteral>(expr);
EXPECT_EQ(intLiteral.value(), testCase.expectedValue);
auto inputLength = testCase.input.length();
EXPECT_EQ(intLiteral.span(), SourceSpan(1, 0, 0, inputLength));
}
}
TEST(WGSLConstLiteralTests, AbstractIntegerLiteralDecimal)
{
using namespace WGSL;
const ConstLiteralTestCase<int64_t> testCases[] = {
{ "0"_s, 0LL },
{ "1"_s, 1LL },
{ "12345"_s, 12345LL },
};
for (const auto& testCase : testCases) {
auto parseResult = parseLCharPrimaryExpression(testCase.input);
EXPECT_TRUE(parseResult);
AST::Expression& expr = parseResult->second;
EXPECT_TRUE(is<AST::AbstractIntegerLiteral>(expr));
const auto& intLiteral = downcast<AST::AbstractIntegerLiteral>(expr);
EXPECT_EQ(intLiteral.value(), testCase.expectedValue);
auto inputLength = testCase.input.length();
EXPECT_EQ(intLiteral.span(), SourceSpan(1, 0, 0, inputLength));
}
}
TEST(WGSLConstLiteralTests, AbstractIntegerLiteralHex)
{
using namespace WGSL;
const ConstLiteralTestCase<int64_t> testCases[] = {
{ "0x0"_s, 0x0LL },
{ "0x1"_s, 0x1LL },
{ "0x12345"_s, 0x12345LL },
};
for (const auto& testCase : testCases) {
auto parseResult = parseLCharPrimaryExpression(testCase.input);
EXPECT_TRUE(parseResult);
AST::Expression& expr = parseResult->second;
EXPECT_TRUE(is<AST::AbstractIntegerLiteral>(expr));
const auto& intLiteral = downcast<AST::AbstractIntegerLiteral>(expr);
EXPECT_EQ(intLiteral.value(), testCase.expectedValue);
auto inputLength = testCase.input.length();
EXPECT_EQ(intLiteral.span(), WGSL::SourceSpan(1, 0, 0, inputLength));
}
}
TEST(WGSLConstLiteralTests, AbstractFloatLiteralDec)
{
using namespace WGSL;
const ConstLiteralTestCase<double> testCases[] = {
{ "0.0"_s, 0.0 },
{ "0.1"_s, 0.1 },
{ "2612.0324"_s, 2612.0324 },
{ "0.00000001"_s, 0.00000001 },
{ "1234.5678e-3"_s, 1234.5678e-3 },
{ "01."_s, 01. },
{ ".01"_s, .01 },
{ "1e-3"_s, 1e-3 }
};
for (const auto& testCase : testCases) {
auto parseResult = parseLCharPrimaryExpression(testCase.input);
EXPECT_TRUE(parseResult);
AST::Expression& expr = parseResult->second;
EXPECT_TRUE(is<AST::AbstractFloatLiteral>(expr));
const auto& floatLiteral = downcast<AST::AbstractFloatLiteral>(expr);
EXPECT_EQ(floatLiteral.value(), testCase.expectedValue);
auto inputLength = testCase.input.length();
EXPECT_EQ(floatLiteral.span(), SourceSpan(1, 0, 0, inputLength));
}
}
} // namespace TestWGSLAPI