// fst_test.cc // 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. // // Copyright 2005-2010 Google, Inc. // Author: riley@google.com (Michael Riley) // // \file // Regression test for FST classes. #include "./fst_test.h" #include <fst/compact-fst.h> #include <fst/const-fst.h> #include <fst/edit-fst.h> #include <fst/matcher-fst.h> namespace fst { // A user-defined arc type. struct CustomArc { typedef short Label; typedef ProductWeight<TropicalWeight, LogWeight> Weight; typedef int64 StateId; CustomArc(Label i, Label o, Weight w, StateId s) : ilabel(i), olabel(o), weight(w), nextstate(s) {} CustomArc() {} static const string &Type() { // Arc type name static const string type = "my"; return type; } Label ilabel; // Transition input label Label olabel; // Transition output label Weight weight; // Transition weight StateId nextstate; // Transition destination state }; // A user-defined compactor for test FST. template <class A> class CustomCompactor { public: typedef A Arc; typedef typename A::Label Label; typedef typename A::StateId StateId; typedef typename A::Weight Weight; typedef pair<Label, Weight> Element; Element Compact(StateId s, const A &arc) const { return make_pair(arc.ilabel, arc.weight); } Arc Expand(StateId s, const Element &p, uint32 f = kArcValueFlags) const { return p.first == kNoLabel ? Arc(kNoLabel, kNoLabel, p.second, kNoStateId) : Arc(p.first, 0, p.second, s); } ssize_t Size() const { return -1;} uint64 Properties() const { return 0ULL;} bool Compatible(const Fst<A> &fst) const { return true; } static const string &Type() { static const string type = "my"; return type; } bool Write(ostream &strm) const { return true; } static CustomCompactor *Read(istream &strm) { return new CustomCompactor; } }; REGISTER_FST(VectorFst, CustomArc); REGISTER_FST(ConstFst, CustomArc); static fst::FstRegisterer< CompactFst<StdArc, CustomCompactor<StdArc> > > CompactFst_StdArc_CustomCompactor_registerer; static fst::FstRegisterer< CompactFst<CustomArc, CustomCompactor<CustomArc> > > CompactFst_CustomArc_CustomCompactor_registerer; static fst::FstRegisterer<ConstFst<StdArc, uint16> > ConstFst_StdArc_uint16_registerer; static fst::FstRegisterer< CompactFst<StdArc, CustomCompactor<StdArc>, uint16> > CompactFst_StdArc_CustomCompactor_uint16_registerer; } // namespace fst using fst::FstTester; using fst::VectorFst; using fst::ConstFst; using fst::MatcherFst; using fst::CompactFst; using fst::Fst; using fst::StdArc; using fst::CustomArc; using fst::CustomCompactor; using fst::StdArcLookAheadFst; using fst::EditFst; int main(int argc, char **argv) { FLAGS_fst_verify_properties = true; std::set_new_handler(FailedNewHandler); SetFlags(argv[0], &argc, &argv, true); // VectorFst<StdArc> tests { FstTester< VectorFst<StdArc> > std_vector_tester; std_vector_tester.TestBase(); std_vector_tester.TestExpanded(); std_vector_tester.TestAssign(); std_vector_tester.TestCopy(); std_vector_tester.TestIO(); std_vector_tester.TestMutable(); } // ConstFst<StdArc> tests { FstTester< ConstFst<StdArc> > std_const_tester; std_const_tester.TestBase(); std_const_tester.TestExpanded(); std_const_tester.TestCopy(); std_const_tester.TestIO(); } // CompactFst<StdArc, CustomCompactor<StdArc> > { FstTester< CompactFst<StdArc, CustomCompactor<StdArc> > > std_compact_tester; std_compact_tester.TestBase(); std_compact_tester.TestExpanded(); std_compact_tester.TestCopy(); std_compact_tester.TestIO(); } // VectorFst<CustomArc> tests { FstTester< VectorFst<CustomArc> > std_vector_tester; std_vector_tester.TestBase(); std_vector_tester.TestExpanded(); std_vector_tester.TestAssign(); std_vector_tester.TestCopy(); std_vector_tester.TestIO(); std_vector_tester.TestMutable(); } // ConstFst<CustomArc> tests { FstTester< ConstFst<CustomArc> > std_const_tester; std_const_tester.TestBase(); std_const_tester.TestExpanded(); std_const_tester.TestCopy(); std_const_tester.TestIO(); } // CompactFst<CustomArc, CustomCompactor<CustomArc> > { FstTester< CompactFst<CustomArc, CustomCompactor<CustomArc> > > std_compact_tester; std_compact_tester.TestBase(); std_compact_tester.TestExpanded(); std_compact_tester.TestCopy(); std_compact_tester.TestIO(); } // ConstFst<StdArc, uint16> tests { FstTester< ConstFst<StdArc, uint16> > std_const_tester; std_const_tester.TestBase(); std_const_tester.TestExpanded(); std_const_tester.TestCopy(); std_const_tester.TestIO(); } // CompactFst<StdArc, CustomCompactor<StdArc>, uint16> { FstTester< CompactFst<StdArc, CustomCompactor<StdArc>, uint16> > std_compact_tester; std_compact_tester.TestBase(); std_compact_tester.TestExpanded(); std_compact_tester.TestCopy(); std_compact_tester.TestIO(); } // FstTester<StdArcLookAheadFst> { FstTester<StdArcLookAheadFst> std_matcher_tester; std_matcher_tester.TestBase(); std_matcher_tester.TestExpanded(); std_matcher_tester.TestCopy(); } // EditFst<StdArc> tests { FstTester< EditFst<StdArc> > std_edit_tester; std_edit_tester.TestBase(); std_edit_tester.TestExpanded(); std_edit_tester.TestAssign(); std_edit_tester.TestCopy(); std_edit_tester.TestMutable(); } cout << "PASS" << endl; return 0; }