普通文本  |  158行  |  5.93 KB

/*
 * 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