/* * Copyright information and license terms for this software can be * found in the file LICENSE that is included with the distribution */ #include #include #include #include #include #include #include #include #include #if EPICS_VERSION_INT>=VERSION_INT(3,15,0,1) # define USE_JSON #endif namespace pvd = epics::pvData; typedef std::vector lines_t; namespace { struct SB { std::ostringstream strm; operator std::string() { return strm.str(); } template SB& operator<<(const T& v) { strm< actual ::detail::testPassx testDiff(const std::string& expect, const std::string& actual, const std::string& msg = std::string()) { bool match = expect==actual; ::detail::testPassx ret(match); ret<createFieldBuilder() ->setId("epics:nt/NTScalar:1.0") ->add("value", pvd::pvInt) ->add("alarm", pvd::getStandardField()->alarm()) ->add("timeStamp", pvd::getStandardField()->timeStamp()) ->createStructure()); void showNTScalarNumeric() { testDiag("%s", CURRENT_FUNCTION); pvd::PVStructurePtr input(pvd::getPVDataCreate()->createPVStructure(scalarNumeric)); input->getSubFieldT("value")->putFrom(-42); testDiff(" -42 \n", print(input->stream())); input->getSubFieldT("alarm.severity")->putFrom(1); input->getSubFieldT("alarm.status")->putFrom(1); input->getSubFieldT("alarm.message")->put("FOO"); testDiff(" -42 MINOR DEVICE FOO \n", print(input->stream())); } static const pvd::StructureConstPtr scalarString(pvd::getFieldCreate()->createFieldBuilder() ->setId("epics:nt/NTScalar:1.0") ->add("value", pvd::pvString) ->add("alarm", pvd::getStandardField()->alarm()) ->add("timeStamp", pvd::getStandardField()->timeStamp()) ->createStructure()); void showNTScalarString() { testDiag("%s", CURRENT_FUNCTION); pvd::PVStructurePtr input(pvd::getPVDataCreate()->createPVStructure(scalarString)); testDiff(" \n", print(input->stream())); input->getSubFieldT("value")->put("bar"); testDiff(" bar \n", print(input->stream())); input->getSubFieldT("alarm.severity")->putFrom(1); input->getSubFieldT("alarm.status")->putFrom(1); input->getSubFieldT("alarm.message")->put("FOO"); testDiff(" bar MINOR DEVICE FOO \n", print(input->stream())); } static const pvd::StructureConstPtr everything(pvd::getFieldCreate()->createFieldBuilder() ->setId("omg") ->add("scalar", pvd::pvString) ->addArray("scalarArray", pvd::pvString) ->addNestedStructure("below") ->add("A", pvd::pvInt) ->addNestedUnion("select") ->add("one", pvd::pvInt) ->add("two", pvd::pvInt) ->endNested() ->addNestedUnionArray("arrselect") ->add("foo", pvd::pvInt) ->add("bar", pvd::pvInt) ->endNested() ->addNestedStructureArray("astruct") ->add("red", pvd::pvInt) ->add("blue", pvd::pvInt) ->endNested() ->endNested() ->add("anything", pvd::getFieldCreate()->createVariantUnion()) ->add("arrayany", pvd::getFieldCreate()->createVariantUnionArray()) ->createStructure()); void testRaw() { testDiag("%s", CURRENT_FUNCTION); pvd::PVStructurePtr input(pvd::getPVDataCreate()->createPVStructure(everything)); testDiff("omg \n" " string scalar \n" " string[] scalarArray []\n" " structure below\n" " int A 0\n" " union select\n" " (none)\n" " union[] arrselect\n" " structure[] astruct\n" " any anything\n" " (none)\n" " any[] arrayany\n" , print(input->stream())); testDiff("omg \n" " string scalar \n" " structure below\n" " int A 0\n" , print(input->stream().show(pvd::BitSet().set(1).set(4)))); testDiff("omg \n" "\033[1m string scalar \n" "\033[0m\033[1m string[] scalarArray []\n" "\033[0m structure below\n" "\033[1m int A 0\n" "\033[0m union select\n" " (none)\n" " union[] arrselect\n" " structure[] astruct\n" " any anything\n" " (none)\n" " any[] arrayany\n" , print(input->stream() .mode(pvd::PVStructure::Formatter::ANSI) // force use of escapes .highlight(pvd::BitSet().set(1).set(2).set(4)) )); } void testEscape() { testDiag("%s", CURRENT_FUNCTION); testEqual("hello world", std::string(SB()<