/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "common/fml-parser.h"
#include "common/feature-descriptors.h"
#include "gtest/gtest.h"
namespace libtextclassifier {
namespace nlp_core {
TEST(FMLParserTest, NoFeature) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
const std::string kFeatureName = "";
EXPECT_TRUE(fml_parser.Parse(kFeatureName, &descriptor));
EXPECT_EQ(0, descriptor.feature_size());
}
TEST(FMLParserTest, FeatureWithNoParams) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
const std::string kFeatureName = "continuous-bag-of-relevant-scripts";
EXPECT_TRUE(fml_parser.Parse(kFeatureName, &descriptor));
EXPECT_EQ(1, descriptor.feature_size());
EXPECT_EQ(kFeatureName, descriptor.feature(0).type());
}
TEST(FMLParserTest, FeatureWithOneKeywordParameter) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
EXPECT_TRUE(fml_parser.Parse("myfeature(start=2)", &descriptor));
EXPECT_EQ(1, descriptor.feature_size());
EXPECT_EQ("myfeature", descriptor.feature(0).type());
EXPECT_EQ(1, descriptor.feature(0).parameter_size());
EXPECT_EQ("start", descriptor.feature(0).parameter(0).name());
EXPECT_EQ("2", descriptor.feature(0).parameter(0).value());
EXPECT_FALSE(descriptor.feature(0).has_argument());
}
TEST(FMLParserTest, FeatureWithDefaultArgumentNegative) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
EXPECT_TRUE(fml_parser.Parse("offset(-3)", &descriptor));
EXPECT_EQ(1, descriptor.feature_size());
EXPECT_EQ("offset", descriptor.feature(0).type());
EXPECT_EQ(0, descriptor.feature(0).parameter_size());
EXPECT_EQ(-3, descriptor.feature(0).argument());
}
TEST(FMLParserTest, FeatureWithDefaultArgumentPositive) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
EXPECT_TRUE(fml_parser.Parse("delta(7)", &descriptor));
EXPECT_EQ(1, descriptor.feature_size());
EXPECT_EQ("delta", descriptor.feature(0).type());
EXPECT_EQ(0, descriptor.feature(0).parameter_size());
EXPECT_EQ(7, descriptor.feature(0).argument());
}
TEST(FMLParserTest, FeatureWithDefaultArgumentZero) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
EXPECT_TRUE(fml_parser.Parse("delta(0)", &descriptor));
EXPECT_EQ(1, descriptor.feature_size());
EXPECT_EQ("delta", descriptor.feature(0).type());
EXPECT_EQ(0, descriptor.feature(0).parameter_size());
EXPECT_EQ(0, descriptor.feature(0).argument());
}
TEST(FMLParserTest, FeatureWithManyKeywordParameters) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
EXPECT_TRUE(fml_parser.Parse("myfeature(ratio=0.316,start=2,name=\"foo\")",
&descriptor));
EXPECT_EQ(1, descriptor.feature_size());
EXPECT_EQ("myfeature", descriptor.feature(0).type());
EXPECT_EQ(3, descriptor.feature(0).parameter_size());
EXPECT_EQ("ratio", descriptor.feature(0).parameter(0).name());
EXPECT_EQ("0.316", descriptor.feature(0).parameter(0).value());
EXPECT_EQ("start", descriptor.feature(0).parameter(1).name());
EXPECT_EQ("2", descriptor.feature(0).parameter(1).value());
EXPECT_EQ("name", descriptor.feature(0).parameter(2).name());
EXPECT_EQ("foo", descriptor.feature(0).parameter(2).value());
EXPECT_FALSE(descriptor.feature(0).has_argument());
}
TEST(FMLParserTest, FeatureWithAllKindsOfParameters) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
EXPECT_TRUE(
fml_parser.Parse("myfeature(17,ratio=0.316,start=2)", &descriptor));
EXPECT_EQ(1, descriptor.feature_size());
EXPECT_EQ("myfeature", descriptor.feature(0).type());
EXPECT_EQ(2, descriptor.feature(0).parameter_size());
EXPECT_EQ("ratio", descriptor.feature(0).parameter(0).name());
EXPECT_EQ("0.316", descriptor.feature(0).parameter(0).value());
EXPECT_EQ("start", descriptor.feature(0).parameter(1).name());
EXPECT_EQ("2", descriptor.feature(0).parameter(1).value());
EXPECT_EQ(17, descriptor.feature(0).argument());
}
TEST(FMLParserTest, FeatureWithWhitespaces) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
EXPECT_TRUE(fml_parser.Parse(
" myfeature\t\t\t\n(17,\nratio=0.316 , start=2) ", &descriptor));
EXPECT_EQ(1, descriptor.feature_size());
EXPECT_EQ("myfeature", descriptor.feature(0).type());
EXPECT_EQ(2, descriptor.feature(0).parameter_size());
EXPECT_EQ("ratio", descriptor.feature(0).parameter(0).name());
EXPECT_EQ("0.316", descriptor.feature(0).parameter(0).value());
EXPECT_EQ("start", descriptor.feature(0).parameter(1).name());
EXPECT_EQ("2", descriptor.feature(0).parameter(1).value());
EXPECT_EQ(17, descriptor.feature(0).argument());
}
TEST(FMLParserTest, Broken_ParamWithoutValue) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
EXPECT_FALSE(
fml_parser.Parse("myfeature(17,ratio=0.316,start)", &descriptor));
}
TEST(FMLParserTest, Broken_MissingCloseParen) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
EXPECT_FALSE(fml_parser.Parse("myfeature(17,ratio=0.316", &descriptor));
}
TEST(FMLParserTest, Broken_MissingOpenParen) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
EXPECT_FALSE(fml_parser.Parse("myfeature17,ratio=0.316)", &descriptor));
}
TEST(FMLParserTest, Broken_MissingQuote) {
FMLParser fml_parser;
FeatureExtractorDescriptor descriptor;
EXPECT_FALSE(fml_parser.Parse("count(17,name=\"foo)", &descriptor));
}
} // namespace nlp_core
} // namespace libtextclassifier