static void TestParseComposeUpdate(TestCommon.Protocol proto, String fileNameInit, String fileName, Action <mtest.Ipublishable_html_tag> updateDelegate)
        {
            mtest.publishable_html_tag_publisher publ = new mtest.publishable_html_tag_publisher();

            SimpleBuffer       bufferInit = SimpleBuffer.readFromFile(fileNameInit);
            IPublishableParser parserInit = TestCommon.makePublishableParser(proto, bufferInit.getReadIterator());

            publ.applyStateSyncMessage(parserInit);


            mtest.publishable_html_tag_subscriber subs = new mtest.publishable_html_tag_subscriber();


            SimpleBuffer       bufferInit2 = SimpleBuffer.readFromFile(fileNameInit);
            IPublishableParser parserInit2 = TestCommon.makePublishableParser(proto, bufferInit2.getReadIterator());

            subs.applyStateSyncMessage(parserInit2);

            // init state at publ and subs are equal
            Assert.True(publ.isEquivalent(subs));


            SimpleBuffer         buffer   = new SimpleBuffer();
            IPublishableComposer composer = TestCommon.makePublishableComposer(proto, buffer);

            publ.startTick(composer);

            updateDelegate(publ);

            publ.endTick();

            if (WriteFiles)
            {
                buffer.writeToFile(fileName);
            }

            SimpleBuffer expected = SimpleBuffer.readFromFile(fileName);

            if (proto == TestCommon.Protocol.Json)
            {
                Assert.True(SimpleBuffer.AreEqualIgnoreEol(expected, buffer));
            }
            else if (proto == TestCommon.Protocol.Gmq)
            {
                Assert.AreEqual(expected, buffer);
            }

            // now state is different

            Assert.False(publ.isEquivalent(subs));
            IPublishableParser parser = TestCommon.makePublishableParser(proto, buffer.getReadIterator());

            subs.applyMessageWithUpdates(parser);

            // now state is equal
            Assert.True(publ.isEquivalent(subs));
        }
        static void TestParseComposeStateSync(TestCommon.Protocol proto, String fileName, Action <mtest.Ipublishable_html_tag> updateDelegate)
        {
            mtest.publishable_html_tag_publisher publ = new mtest.publishable_html_tag_publisher();

            SimpleBuffer         bufferTmp   = new SimpleBuffer();
            IPublishableComposer composerTmp = TestCommon.makePublishableComposer(proto, bufferTmp);

            publ.startTick(composerTmp);

            updateDelegate(publ);

            publ.endTick();

            SimpleBuffer         buffer   = new SimpleBuffer();
            IPublishableComposer composer = TestCommon.makePublishableComposer(proto, buffer);

            publ.generateStateSyncMessage(composer);

            // uncomment to update file
            if (WriteFiles)
            {
                buffer.writeToFile(fileName);
            }

            SimpleBuffer expected = SimpleBuffer.readFromFile(fileName);

            if (proto == TestCommon.Protocol.Json)
            {
                Assert.True(SimpleBuffer.AreEqualIgnoreEol(expected, buffer));
            }
            else if (proto == TestCommon.Protocol.Gmq)
            {
                Assert.AreEqual(expected, buffer);
            }


            mtest.publishable_html_tag_subscriber subs = new mtest.publishable_html_tag_subscriber();

            IPublishableParser parser = TestCommon.makePublishableParser(proto, buffer.getReadIterator());

            subs.applyStateSyncMessage(parser);
            Assert.True(publ.isEquivalent(subs));
        }