blob: 9a1293fa8b0d073944424c36e927abfc69ad6b50 [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <gtest/gtest.h>
#include <string>
#include "chrome/knowledge/handwriting/validate.pb.h"
#include "ml/handwriting.h"
#include "ml/handwriting_proto_mojom_conversion.h"
namespace ml {
using chromeos::machine_learning::mojom::HandwritingRecognitionQueryPtr;
// Gets a test request proto with two strokes.
chrome_knowledge::HandwritingRecognizerRequest
GetHandwritingRecognizerRequestProto() {
chrome_knowledge::HandwritingRecognizerRequest request;
request.set_max_num_results(3);
request.set_return_segmentation(true);
chrome_knowledge::RecognitionContext& context = *request.mutable_context();
context.set_pre_context("random_pre_context");
context.mutable_writing_guide()->set_width(0.4f);
context.mutable_writing_guide()->set_height(0.6f);
chrome_knowledge::InkPoint p1, p2;
p1.set_x(11);
p1.set_y(12);
p1.set_t(13);
// Point p2 doesn't have a time information.
p2.set_x(21);
p2.set_y(22);
chrome_knowledge::InkStroke s1, s2;
*s1.add_points() = p1;
*s2.add_points() = p1;
*s2.add_points() = p2;
chrome_knowledge::Ink ink;
*ink.add_strokes() = s1;
*ink.add_strokes() = s2;
*request.mutable_ink() = ink;
return request;
}
// Tests that proto->mojom->proto->mojom returns the same result as expected.
TEST(HandwritingProtoMojomConversionTest, RequestProtoToQuery) {
const chrome_knowledge::HandwritingRecognizerRequest proto =
GetHandwritingRecognizerRequestProto();
const HandwritingRecognitionQueryPtr query =
HandwritingRecognitionQueryFromProtoForTesting(proto);
const chrome_knowledge::HandwritingRecognizerRequest proto_constructed =
HandwritingRecognitionQueryToProto(
HandwritingRecognitionQueryFromProtoForTesting(proto));
const HandwritingRecognitionQueryPtr query_constructed =
HandwritingRecognitionQueryFromProtoForTesting(proto_constructed);
EXPECT_TRUE(query.Equals(query_constructed));
EXPECT_EQ(proto.SerializeAsString(), proto_constructed.SerializeAsString());
}
// Tests proto->mojom->proto returns same result as expected.
TEST(HandwritingProtoMojomConversionTest, RequestProtoToQueryRealExamples) {
// Nothing to test on an unsupported platform.
if (ml::HandwritingLibrary::GetInstance()->GetStatus() ==
ml::HandwritingLibrary::Status::kNotSupported) {
return;
}
chrome_knowledge::HandwritingRecognizerLabeledRequests test_data;
std::string buf;
ASSERT_TRUE(base::ReadFileToString(
base::FilePath("/build/share/libhandwriting/correct_labeled_requests.pb"),
&buf));
ASSERT_TRUE(test_data.ParseFromString(buf));
ASSERT_GT(test_data.labeled_requests().size(), 0);
for (auto const& labeled_request : test_data.labeled_requests()) {
chrome_knowledge::HandwritingRecognizerRequest proto_constructed =
HandwritingRecognitionQueryToProto(
HandwritingRecognitionQueryFromProtoForTesting(
labeled_request.request()));
chrome_knowledge::HandwritingRecognizerRequest proto_expected =
labeled_request.request();
// This is a known issue. When we convert proto->mojom, a default value is
// added for mojom struct which is added later on to the proto when we do
// mojom->proto.
// We know having these two fields set is not an problem.
if (!proto_expected.has_max_num_results()) {
proto_expected.set_max_num_results(0);
}
if (!proto_expected.has_return_segmentation()) {
proto_expected.set_return_segmentation(false);
}
EXPECT_EQ(proto_constructed.DebugString(), proto_expected.DebugString());
}
}
} // namespace ml