public void Test21_FwAddsEntryCAndComment([ValueSource(typeof(ModelVersionValue), nameof(ModelVersionValue.GetValues))] int dbVersion)
        {
            // Setup
            _FieldWorks.ApplyPatches(dbVersion, 7);
            _webwork.ApplyPatches(dbVersion, 6);
            _LanguageForge.RestoreDatabase(dbVersion, 6);

            // Exercise
            LfMergeHelper.Run($"--project {Settings.DbName} --action=Synchronize");

            // Verify
            Assert.That(TestHelper.SRState, Is.EqualTo("IDLE"));

            // language=json
            const string expected = @"[ { 'lexicon': [
				{ 'lexeme': { 'fr' : { 'value' : 'B' } },
					'senses' : [ {
						'definition' : { 'en' : { 'value' : 'B' } }
				} ] },
				{ 'lexeme': { 'fr' : { 'value' : 'C' } },
					'senses' : [ {
						/* no definition */
						'gloss' : { 'en' : { 'value' : 'C' } }
				} ] },
				{ 'lexeme': { 'fr' : { 'value' : 'A' } },
					'senses' : [ {
						/* no definition */
						'gloss' : { 'en' : { 'value' : 'A' } }
				} ] }
			]}, { 'notes': [
				{ 'class' : 'question',
					'ref' : 'A',
					'messages': [
						{ 'message' : {
						'status': '',
						'value': 'FW comment on word A'
					}}]
				}, { 'class' : 'question',
					'ref' : 'B',
					'messages': [
					{ 'message' : {
						'status': 'open',
						'value': 'Comment on word B'
					}}]
				}, { 'class' : 'question',
					'ref' : 'C',
					'messages': [
					{ 'message' : {
						'status': '',
						'value': 'Comment about new word C'
					}}]
				}
			]}]"            ;

            VerifyMongo.AssertData(expected);

            var expectedXml = JsonToXml.Convert(expected);

            VerifyLanguageDepot.AssertFilesContain(expectedXml);
        }
        public void Test11_LfAddsCommentOnF_FwResolves_LfReopens([ValueSource(typeof(ModelVersionValue), nameof(ModelVersionValue.GetValues))] int dbVersion)
        {
            // Setup
            _webwork.ApplyPatches(dbVersion, 25);
            _LanguageForge.RestoreDatabase(dbVersion, 26);
            _FieldWorks.ApplyPatches(dbVersion, 25);

            // Exercise
            LfMergeHelper.Run($"--project {Settings.DbName} --action=Synchronize");

            // Verify
            Assert.That(TestHelper.SRState, Is.EqualTo("IDLE"));

            var expected = $"[ {{ 'notes': [ {CommentsA_D}, {CommentE}, " +
                           // language=json
                           @"{ 'class' : 'question',
				'ref' : 'F',
				'messages': [
					{ 'message' : {
						'status': 'open',
						'value': 'LF comment on F'
					}}, { 'message': {
						'status': 'resolved'
					}}, { 'message': {
						'status': 'open'
					}}
				] }
			]}]"            ;

            VerifyMongo.AssertData(expected);

            var expectedXml = JsonToXml.Convert(expected);

            VerifyLanguageDepot.AssertFilesContain(expectedXml);
        }
        public void EditWinsOverDelete([ValueSource(typeof(ModelVersionValue), nameof(ModelVersionValue.GetValues))] int dbVersion)
        {
            // Setup
            _mongo.RestoreDatabase(dbVersion, 4);
            _languageDepot.ApplyPatches(dbVersion, 4);
            _webWork.ApplyPatches(dbVersion, 3);

            // Exercise
            LfMergeHelper.Run($"--project {Settings.DbName} --action=Synchronize");

            // Verify
            Assert.That(TestHelper.SRState, Is.EqualTo("IDLE"));

            // language=json
            const string expected = @"[ { 'lexicon': [
				{ 'lexeme': { 'fr' : { 'value' : 'lf1modified' } },
					'senses' : [ {
						'definition' : { 'en' : { 'value' : 'Word added by LF' } },
						'partOfSpeech' : { 'value' : 'n1' }
					} ] },
				{ 'lexeme': { 'fr' : { 'value' : 'flexmodified' } },
					'senses' : [ {
						/* no definition */
						'gloss' : { 'en' : { 'value' : 'created in FLEx' } },
						'partOfSpeech' : { 'value' : 'adv1' }
					} ] },
				]}]"                ;

            VerifyMongo.AssertData(expected);

            var expectedXml = JsonToXml.Convert(expected);

            VerifyLanguageDepot.AssertFilesContain(expectedXml);
        }
        public void Test08_FwAddsCommentOnA_LfAddsCommentOnB_LfSyncsFirst([ValueSource(typeof(ModelVersionValue), nameof(ModelVersionValue.GetValues))] int dbVersion)
        {
            // Setup
            _webwork.ApplyPatches(dbVersion, 4);
            // apply patch 6 without 4
            _webwork.ApplySinglePatch(dbVersion, 6, false);
            _webwork.RemoveNodeFromFile("Lexicon.fwstub.ChorusNotes",
                                        "/notes/annotation[message='FW comment on word A']",
                                        "Patch 6 without 4 (Add comment on B)");
            _FieldWorks.ApplyPatches(dbVersion, 4);
            _FieldWorks.MergeWith(_webwork);

            _LanguageForge.RestoreDatabase(dbVersion, 5);

            // Exercise
            LfMergeHelper.Run($"--project {Settings.DbName} --action=Synchronize");

            // Verify
            Assert.That(TestHelper.SRState, Is.EqualTo("IDLE"));

            // language=json
            const string expected = @"[ { 'lexicon': [
				{ 'lexeme': { 'fr' : { 'value' : 'B' } },
					'senses' : [ {
						'definition' : { 'en' : { 'value' : 'B' } }
					} ] },
				{ 'lexeme': { 'fr' : { 'value' : 'A' } },
					'senses' : [ {
						/* no definition */
						'gloss' : { 'en' : { 'value' : 'A' } }
					} ] }
			]}, { 'notes': [
				{ 'class' : 'question',
					'ref' : 'B',
					'messages': [
						{'message' : {
						'status': 'open',
						'value': 'Comment on word B'
					}}]
				}, { 'class' : 'question',
					'ref' : 'A',
					'messages': [
						{'message' : {
						'status': '',
						'value': 'FW comment on word A'
					}}]
				}
			]}]"            ;

            VerifyMongo.AssertData(expected);

            var expectedXml = JsonToXml.Convert(expected);

            VerifyLanguageDepot.AssertFilesContain(expectedXml);
        }
        public void Test09a_FwAddsCommentOnE_LfReplies([ValueSource(typeof(ModelVersionValue), nameof(ModelVersionValue.GetValues))] int dbVersion)
        {
            // Setup
            _webwork.ApplyPatches(dbVersion, 17);
            _FieldWorks.ApplyPatches(dbVersion, 17);
            _LanguageForge.RestoreDatabase(dbVersion, 18);

            // Exercise
            LfMergeHelper.Run($"--project {Settings.DbName} --action=Synchronize");

            // Verify
            Assert.That(TestHelper.SRState, Is.EqualTo("IDLE"));

            // NOTE: although Chorus stores a status on every comment when we have replies,
            // only the last status determines the overall status of the comment!

            var expected = $"[ {{ 'notes': [ {CommentsA_D}, " +
                           // language=json
                           @"{ 'class' : 'question',
				'ref' : 'E',
				'messages': [
					{'message' : {
						'status': '',
						'value': 'FW comment on E'
					} },
					{ 'message': {
						'status': 'open',
						'value': 'LF reply on E'
					} }
				] }
			]}]"            ;

            VerifyMongo.AssertData(expected);

            var expectedXml = JsonToXml.Convert(expected);

            VerifyLanguageDepot.AssertFilesContain(expectedXml);
        }