blob: 0ad5662447a76eb7c9e547076ea34eeb32bc5297 [file] [log] [blame]
Honglin Yu0c4760a2020-04-18 20:53:31 +10001// Copyright 2020 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <fstream>
6#include <string>
charleszhao05c5a4a2020-06-09 16:49:54 +10007#include <vector>
Honglin Yu0c4760a2020-04-18 20:53:31 +10008
9#include <base/files/file_path.h>
10#include <base/files/file_util.h>
11#include <gtest/gtest.h>
12
13#include "chrome/knowledge/handwriting/validate.pb.h"
14#include "ml/handwriting.h"
charleszhao05c5a4a2020-06-09 16:49:54 +100015#include "ml/handwriting_path.h"
Honglin Yu0c4760a2020-04-18 20:53:31 +100016
17namespace ml {
18
charleszhao05c5a4a2020-06-09 16:49:54 +100019using chromeos::machine_learning::mojom::HandwritingRecognizerSpec;
20using chromeos::machine_learning::mojom::HandwritingRecognizerSpecPtr;
21
Honglin Yu0c4760a2020-04-18 20:53:31 +100022TEST(HandwritingLibraryTest, CanLoadLibrary) {
23 auto* const instance = ml::HandwritingLibrary::GetInstance();
24#ifdef ML_SUPPORT_HANDWRITING
charleszhao05c5a4a2020-06-09 16:49:54 +100025#if __has_feature(address_sanitizer)
26 EXPECT_EQ(instance->GetStatus(),
27 ml::HandwritingLibrary::Status::kNotSupported);
28#else
29 EXPECT_EQ(instance->GetStatus(), ml::HandwritingLibrary::Status::kOk);
30#endif
Honglin Yu0c4760a2020-04-18 20:53:31 +100031#else
32 EXPECT_EQ(instance->GetStatus(),
charleszhao17777f92020-04-23 12:53:11 +100033 ml::HandwritingLibrary::Status::kNotSupported);
Honglin Yu0c4760a2020-04-18 20:53:31 +100034#endif
35}
36
charleszhao05c5a4a2020-06-09 16:49:54 +100037// Tests each supported language against a file of labeled requests.
Honglin Yu0c4760a2020-04-18 20:53:31 +100038TEST(HandwritingLibraryTest, ExampleRequest) {
39 auto* const instance = ml::HandwritingLibrary::GetInstance();
charleszhao17777f92020-04-23 12:53:11 +100040 // Nothing to test on an unsupported platform.
41 if (instance->GetStatus() == ml::HandwritingLibrary::Status::kNotSupported) {
42 return;
43 }
44
Honglin Yu0c4760a2020-04-18 20:53:31 +100045 ASSERT_EQ(instance->GetStatus(), ml::HandwritingLibrary::Status::kOk);
46
charleszhao05c5a4a2020-06-09 16:49:54 +100047 const std::vector<std::string> languages = {"en", "gesture_in_context"};
Honglin Yu0c4760a2020-04-18 20:53:31 +100048
charleszhao05c5a4a2020-06-09 16:49:54 +100049 for (const auto& language : languages) {
50 HandwritingRecognizerSpecPtr spec =
51 HandwritingRecognizerSpec::New(language);
52
53 HandwritingRecognizer const recognizer =
54 instance->CreateHandwritingRecognizer();
55 const chrome_knowledge::HandwritingRecognizerModelPaths paths =
56 GetModelPaths(spec.Clone()).value();
57 chrome_knowledge::HandwritingRecognizerOptions options;
Honglin Yu0c4760a2020-04-18 20:53:31 +100058 ASSERT_TRUE(
charleszhao05c5a4a2020-06-09 16:49:54 +100059 instance->LoadHandwritingRecognizer(recognizer, options, paths));
60
61 chrome_knowledge::HandwritingRecognizerLabeledRequests test_data;
62 std::string buf;
63 ASSERT_TRUE(base::ReadFileToString(
64 base::FilePath(GetLabeledRequestsPathForTesting(spec.Clone())), &buf));
65 ASSERT_TRUE(test_data.ParseFromString(buf));
66 ASSERT_GT(test_data.labeled_requests().size(), 0);
67 for (auto const& request : test_data.labeled_requests()) {
68 chrome_knowledge::HandwritingRecognizerResult result;
69 ASSERT_TRUE(instance->RecognizeHandwriting(recognizer, request.request(),
70 &result));
71 ASSERT_GT(result.candidates().size(), 0);
72 EXPECT_EQ(result.candidates(0).text(), request.label());
73 }
74 instance->DestroyHandwritingRecognizer(recognizer);
Honglin Yu0c4760a2020-04-18 20:53:31 +100075 }
Honglin Yu0c4760a2020-04-18 20:53:31 +100076}
Honglin Yu0c4760a2020-04-18 20:53:31 +100077
78} // namespace ml