public void StandardValidator_EditingHintsCanReorder()
        {
            MarkedSpan mrk;
            Segment segment;
            SpanningCode span;
            Unit unit;

            Console.WriteLine("Test with no at start in source.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            segment.Source.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Target.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.Yes });
            this.VerifyValidationException(ValidationError.CodeBaseSequenceStartsWithCanReorderNo);

            Console.WriteLine("Test with no at start in target.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            segment.Source.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.Yes });
            segment.Target.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            this.VerifyValidationException(ValidationError.CodeBaseSequenceStartsWithCanReorderNo);

            Console.WriteLine("Test with 1 element in sequence.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            segment.Source.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            segment.Target.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.Yes });
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with missing element in sequence.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            segment.Source.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            mrk = new MarkedSpan("mrk1");
            segment.Source.Text.Add(mrk);
            mrk.Text.Add(new StandaloneCode("ph1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Target.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            this.VerifyValidationException(ValidationError.CodeBaseTagDeleted);

            Console.WriteLine("Test with reordered sequence.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            segment.Source.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            mrk = new MarkedSpan("mrk1");
            segment.Source.Text.Add(mrk);
            mrk.Text.Add(new StandaloneCode("ph1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Target.Text.Add(new StandaloneCode("ph1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            segment.Target.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            this.VerifyValidationException(ValidationError.CodeBaseSequenceNotFound);

            Console.WriteLine("Test with added element in sequence.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            segment.Source.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            mrk = new MarkedSpan("mrk1");
            segment.Source.Text.Add(mrk);
            mrk.Text.Add(new StandaloneCode("ph1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Target.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            segment.Target.Text.Add(new StandaloneCode("ph1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Target.Text.Add(new SpanningCodeStart("sc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            this.VerifyValidationException(ValidationError.CodeBaseSequenceMismatch);

            Console.WriteLine("Test with missing sequence.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            segment.Source.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            mrk = new MarkedSpan("mrk1");
            segment.Source.Text.Add(mrk);
            mrk.Text.Add(new StandaloneCode("ph1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            this.VerifyValidationException(ValidationError.CodeBaseTagDeleted);

            Console.WriteLine("Test with CanCopy = true.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            segment.Source.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            mrk = new MarkedSpan("mrk1");
            segment.Source.Text.Add(mrk);
            mrk.Text.Add(new StandaloneCode("ph1") { CanCopy = true, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Target.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            segment.Target.Text.Add(new StandaloneCode("ph1") { CanCopy = true, CanDelete = false, CanReorder = CanReorderValue.No });
            this.VerifyValidationException(ValidationError.CodeBaseMismatchedCanReorderCopyDelete);

            Console.WriteLine("Test with CanDelete = true.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            segment.Source.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            mrk = new MarkedSpan("mrk1");
            segment.Source.Text.Add(mrk);
            mrk.Text.Add(new StandaloneCode("ph1") { CanCopy = false, CanDelete = true, CanReorder = CanReorderValue.No });
            segment.Target.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            segment.Target.Text.Add(new StandaloneCode("ph1") { CanCopy = false, CanDelete = true, CanReorder = CanReorderValue.No });
            this.VerifyValidationException(ValidationError.CodeBaseMismatchedCanReorderCopyDelete);

            Console.WriteLine("Test with multiple sequence where sequences are reordered.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            segment.Source.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            mrk = new MarkedSpan("mrk1");
            segment.Source.Text.Add(mrk);
            mrk.Text.Add(new StandaloneCode("ph1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Source.Text.Add(new SpanningCode("pc2") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            mrk = new MarkedSpan("mrk2");
            segment.Source.Text.Add(mrk);
            mrk.Text.Add(new StandaloneCode("ph2") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            mrk.Text.Add(new StandaloneCode("ph3") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Source.Text.Add(new SpanningCodeStart("sc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No, Isolated = true });
            segment.Source.Text.Add(new SpanningCodeEnd("ec1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No, Isolated = true });
            segment.Source.Text.Add(new SpanningCodeEnd("ec2") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.Yes, Isolated = true });
            segment.Target.Text.Add(new StandaloneCode("ph2") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            segment.Target.Text.Add(new StandaloneCode("ph3") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Target.Text.Add(new SpanningCodeStart("sc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No, Isolated = true });
            segment.Target.Text.Add(new SpanningCodeEnd("ec1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No, Isolated = true });
            segment.Target.Text.Add(new SpanningCodeEnd("ec2") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.Yes, Isolated = true });
            segment.Target.Text.Add(new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            segment.Target.Text.Add(new StandaloneCode("ph1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Target.Text.Add(new SpanningCode("pc2") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with invalid source hierarchy.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            span = new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.Yes };
            span.Text.Add(new SpanningCode("pc2") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            segment.Source.Text.Add(span);
            segment.Source.Text.Add(new SpanningCode("pc3") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Target = null;
            this.VerifyValidationException(ValidationError.CodeBaseInvalidSourceSequenceHierarchy);

            Console.WriteLine("Test with invalid target hierarchy.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            span = new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.Yes };
            span.Text.Add(new SpanningCode("pc2") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            span.Text.Add(new SpanningCode("pc3") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Source.Text.Add(span);
            span = new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.Yes };
            span.Text.Add(new SpanningCode("pc2") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo });
            segment.Target.Text.Add(span);
            segment.Target.Text.Add(new SpanningCode("pc3") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            this.VerifyValidationException(ValidationError.CodeBaseInvalidTargetSequenceHierarchy);

            Console.WriteLine("Test with mismatched hierarchy.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();
            span = new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo };
            span.Text.Add(new SpanningCode("pc2") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            span.Text.Add(new SpanningCode("pc3") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Source.Text.Add(span);
            span = new SpanningCode("pc1") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.FirstNo };
            span.Text.Add(new SpanningCode("pc2") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            segment.Target.Text.Add(span);
            segment.Target.Text.Add(new SpanningCode("pc3") { CanCopy = false, CanDelete = false, CanReorder = CanReorderValue.No });
            this.VerifyValidationException(ValidationError.CodeBaseSequenceHierarchyMismatch);
        }
        public void StandardValidator_EditingHintsCanDelete()
        {
            MarkedSpan mrk;
            Segment segment;
            SpanningCode sourceCode;
            SpanningCodeStart startCode;
            Unit unit;

            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();

            sourceCode = new SpanningCode("pc1");
            sourceCode.CanDelete = false;
            segment.Source.Text.Add(sourceCode);

            mrk = new MarkedSpan("mrk1");
            segment.Target.Text.Add(mrk);

            this.VerifyValidationException(ValidationError.CodeBaseTagDeleted);

            // Add a start tag to the target. Since the Id doesn't match the pc, validation still fails.
            startCode = new SpanningCodeStart("sc1");
            segment.Target.Text.Add(startCode);
            this.VerifyValidationException(ValidationError.CodeBaseTagDeleted);

            // Name the sc tag the same as the pc tag. Validation fails because the sc tag is isolated.
            startCode.Id = "pc1";
            startCode.Isolated = true;
            this.VerifyValidationException(ValidationError.ContainerResourceTypesWithSameIdMismatch);

            // Add the ec and make the sc not isolated. Now validation should pass because sc and pc are equivalent.
            startCode.Isolated = false;
            segment.Target.Text.Add(new SpanningCodeEnd() { StartReference = startCode.Id });
            StandardValidatorTests._validator.Validate(this._document);
        }
        public void StandardValidator_SpanningCode()
        {
            SpanningCode span;
            Segment segment;
            Unit unit;

            span = new SpanningCode();

            Console.WriteLine("Test with null Id.");
            this.DeserializeDocument();
            unit = (Unit)this._document.Files[0].Containers.First(c => c is Unit);
            segment = (Segment)unit.Resources.First(r => r is Segment);
            segment.Source.Text.Add(span);
            this.VerifyValidationException(ValidationError.CodeBaseIdNull);

            Console.WriteLine("Test with empty Id.");
            span.Id = String.Empty;
            this.VerifyValidationException(ValidationError.CodeBaseIdNull);

            Console.WriteLine("Test with duplicate Id.");
            segment.Id = "duplicateId";
            span.Id = segment.Id;
            this.VerifyValidationException(ValidationError.ElementIdDuplicate);

            Console.WriteLine("Test with item on target not matching source.");
            span.Id = "newSpanId";
            segment.Target.Text.Add(new MarkedSpan("bogus"));
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with DataReferenceEnd matching data.");
            span = new SpanningCode("spanId");
            span.Type = CodeType.Formatting;
            this.DeserializeDocument();
            unit = (Unit)this._document.Files[0].Containers.First(c => c is Unit);
            unit.OriginalData = new OriginalData();
            unit.OriginalData.AddData("dataId", "text");
            segment = (Segment)unit.Resources.First(r => r is Segment);
            segment.Source.Text.Add(span);
            span.DataReferenceEnd = "dataId";
            span.DataReferenceStart = "dataId";
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with DataReferenceEnd not matching data.");
            span.DataReferenceEnd = "bogus";
            this.VerifyValidationException(ValidationError.SpanningCodeInvalidDataRefEnd);

            Console.WriteLine("Test with DataReferenceEnd is null.");
            span.DataReferenceEnd = null;
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with DataReferenceEnd is empty.");
            span.DataReferenceEnd = String.Empty;
            this.VerifyValidationException(ValidationError.SpanningCodeInvalidDataRefEnd);

            span.DataReferenceEnd = "dataId";

            Console.WriteLine("Test with DataReferenceStart not matching data.");
            span.DataReferenceStart = "bogus";
            this.VerifyValidationException(ValidationError.SpanningCodeInvalidDataRefStart);

            Console.WriteLine("Test with DataReferenceStart is null.");
            span.DataReferenceStart = null;
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with DataReferenceStart is empty.");
            span.DataReferenceStart = String.Empty;
            this.VerifyValidationException(ValidationError.SpanningCodeInvalidDataRefStart);

            Console.WriteLine("Test with SubFlowsEnd is null.");
            span = new SpanningCode("spanId");
            span.Type = CodeType.Formatting;
            this.DeserializeDocument();
            unit = (Unit)this._document.Files[0].Containers.First(c => c is Unit);
            unit.OriginalData = new OriginalData();
            unit.OriginalData.AddData("dataId", "text");
            segment = (Segment)unit.Resources.First(r => r is Segment);
            segment.Source.Text.Add(span);
            span.DataReferenceEnd = "dataId";
            span.DataReferenceStart = "dataId";
            span.SubFlowsEnd = null;
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with SubFlowsEnd is empty.");
            span.SubFlowsEnd = String.Empty;
            this.VerifyValidationException(ValidationError.SpanningCodeInvalidSubFlowsEnd);

            Console.WriteLine("Test with SubFlowsEnd matching a unit.");
            span.SubFlowsEnd = "u1";
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with SubFlowsEnd matching multiple units.");
            span.SubFlowsEnd = "u1 u2 u3";
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with SubFlowsEnd multiple units with one not matching.");
            span.SubFlowsEnd = "u1 u200 u3";
            this.VerifyValidationException(ValidationError.SpanningCodeInvalidSubFlowsEnd);

            Console.WriteLine("Test with SubFlowsStart is null.");
            span = new SpanningCode("spanId");
            span.Type = CodeType.Formatting;
            this.DeserializeDocument();
            unit = (Unit)this._document.Files[0].Containers.First(c => c is Unit);
            unit.OriginalData = new OriginalData();
            unit.OriginalData.AddData("dataId", "text");
            segment = (Segment)unit.Resources.First(r => r is Segment);
            segment.Source.Text.Add(span);
            span.DataReferenceEnd = "dataId";
            span.DataReferenceStart = "dataId";
            span.SubFlowsStart = null;
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with SubFlowsStart is empty.");
            span.SubFlowsStart = String.Empty;
            this.VerifyValidationException(ValidationError.SpanningCodeInvalidSubFlowsStart);

            Console.WriteLine("Test with SubFlowsStart matching a unit.");
            span.SubFlowsStart = "u1";
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with SubFlowsStart matching multiple units.");
            span.SubFlowsStart = "u1 u2 u3";
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with SubFlowsStart multiple units with one not matching.");
            span.SubFlowsStart = "u1 u200 u3";
            this.VerifyValidationException(ValidationError.SpanningCodeInvalidSubFlowsStart);

            Console.WriteLine("Test with SubType not like prefix:value.");
            span = new SpanningCode("spanId");
            span.Type = CodeType.Formatting;
            this.DeserializeDocument();
            unit = (Unit)this._document.Files[0].Containers.First(c => c is Unit);
            unit.OriginalData = new OriginalData();
            unit.OriginalData.AddData("dataId", "text");
            segment = (Segment)unit.Resources.First(r => r is Segment);
            segment.Source.Text.Add(span);
            span.DataReferenceEnd = "dataId";
            span.DataReferenceStart = "dataId";
            span.SubType = "a";
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with SubType using xlf:value.");
            span.SubType = "Xlf:value";
            this.VerifyValidationException(ValidationError.CodeBaseSubTypeInvalid);

            Console.WriteLine("Test with SubType using prefix:value:value is ok.");
            span.SubType = "prefix:value:value";
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with SubType set and Type not.");
            span.SubType = "prefix:value";
            span.Type = null;
            this.VerifyValidationException(ValidationError.CodeBaseTypeNotSpecified);

            Console.WriteLine("Test with SubType is null.");
            span.SubType = null;
            span.Type = CodeType.Formatting;
            StandardValidatorTests._validator.Validate(this._document);

            foreach (string name in new string[] { "lb", "pb", "b", "i", "u" })
            {
                Console.WriteLine("Test with SubType set to {0} and Type set to fmt.", name);
                span.SubType = "xlf:" + name;
                span.Type = CodeType.Formatting;
                StandardValidatorTests._validator.Validate(this._document);

                Console.WriteLine("Test with SubType set to {0} and Type not set to fmt.", name);
                span.Type = CodeType.Image;
                this.VerifyValidationException(ValidationError.CodeBaseSubTypeMismatchFormatting);
            }

            Console.WriteLine("Test with SubType set to var and Type set to var.");
            span.SubType = "xlf:var";
            span.Type = CodeType.UserInterface;
            StandardValidatorTests._validator.Validate(this._document);

            Console.WriteLine("Test with SubType set to var and Type not set to var.");
            span.Type = CodeType.Image;
            this.VerifyValidationException(ValidationError.CodeBaseSubTypeMismatchUserInterface);
        }
        public void StandardValidator_EditingHintsCanCopy()
        {
            MarkedSpan mrk;
            Segment segment;
            SpanningCode sourceCode;
            SpanningCode targetCode;
            Unit unit;

            Console.WriteLine("Test with copy from source.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();

            sourceCode = new SpanningCode("pc1");
            sourceCode.CanCopy = false;
            segment.Source.Text.Add(sourceCode);

            mrk = new MarkedSpan("mrk1");
            segment.Target.Text.Add(mrk);

            targetCode = new SpanningCode("pc2");
            targetCode.CopyOf = "pc1";
            targetCode.DataReferenceEnd = null;
            targetCode.DataReferenceStart = null;
            mrk.Text.Add(targetCode);

            this.VerifyValidationException(ValidationError.CodeBaseTargetCopyOfTypeMismatchOrNotCanCopy);

            Console.WriteLine("Test with copy from target.");
            this.DeserializeDocument();
            unit = this._document.Files[0].Containers.Where(c => c is Unit).First() as Unit;
            segment = unit.Resources.Where(c => c is Segment).Cast<Segment>().First();

            sourceCode = new SpanningCode("pc1");
            sourceCode.CanCopy = false;
            segment.Target.Text.Add(sourceCode);

            mrk = new MarkedSpan("mrk1");
            segment.Target.Text.Add(mrk);

            targetCode = new SpanningCode("pc2");
            targetCode.CopyOf = "pc1";
            mrk.Text.Add(targetCode);

            this.VerifyValidationException(ValidationError.CodeBaseTargetCopyOfTypeMismatchOrNotCanCopy);
        }
        /// <summary>
        /// Creates a <see cref="SpanningCode"/> with every element and attribute.
        /// </summary>
        /// <param name="copyOf">The Id of the element to copy, or null.</param>
        /// <returns>The created <see cref="SpanningCode"/>.</returns>
        private SpanningCode CreatePc(string copyOf)
        {
            SpanningCode result;

            result = new SpanningCode("pc" + this.GetNextId(typeof(SpanningCode)));
            result.CanCopy = true;
            result.CanDelete = true;
            result.CanOverlap = true;
            result.CanReorder = CanReorderValue.Yes;
            result.CopyOf = copyOf;
            result.DataReferenceEnd = null;
            result.DataReferenceStart = null;
            result.Directionality = ContentDirectionality.Auto;
            result.DisplayTextEnd = "end";
            result.DisplayTextStart = "start";
            result.EquivalentStorage = "storage";
            result.EquivalentTextEnd = "equivend";
            result.EquivalentTextStart = "equivstart";
            result.FormatStyle = FormatStyleValue.Anchor;
            result.SizeInfoReference = "sizeref";
            result.SizeRestriction = "restriction";
            result.StorageRestriction = "restriction";
            result.SubFlowsEnd = "u1";
            result.SubFlowsStart = "u1";
            result.SubFormatStyle.Add("key1", "value1");
            result.SubFormatStyle.Add("key2", "value2");
            result.SubType = "pre:subtype";
            result.Text.Add(new PlainText("text"));
            result.Type = CodeType.Formatting;

            return result;
        }