public static IEnumerable <XElement> Construct(IList <Item> items,
                                                XElement itemPool, Assessment assessment)
 {
     // Each language will get its own test form, but they will be identical
     return(itemPool.XPathSelectElements("//poolproperty")
            .Where(x => x.Attribute("property").Value.Equals("Language", StringComparison.OrdinalIgnoreCase))
            .Select(x => x.Attribute("value").Value)
            .Distinct().ToList().Select(x =>
                                        new XElement("testform",
                                                     new XAttribute("length", items.Count().ToString()),
                                                     new XElement("identifier",
                                                                  new XAttribute("uniqueid", $"{assessment.UniqueId}:Default-{x}"),
                                                                  new XAttribute("name", $"{assessment.UniqueId}:Default-{x}"),
                                                                  new XAttribute("version", "1")),
                                                     new XElement("property",
                                                                  new XAttribute("name", "language"),
                                                                  new XAttribute("value", x),
                                                                  new XAttribute("label", x)),
                                                     new XElement("poolproperty",
                                                                  new XAttribute("property", "Language"),
                                                                  new XAttribute("value", x),
                                                                  new XAttribute("label", x),
                                                                  new XAttribute("itemcount", items.Count().ToString())),
                                                     PoolPropertyUtilities.GeneratePoolPropertyTypes(itemPool),
                                                     FormPartition.Construct(items, itemPool, assessment))));
 }
        public static IEnumerable <XElement> Construct()
        {
            var result        = new List <XElement>();
            var scoringRules  = ScoringRules.Construct(ExtractionSettings.AssessmentScoring);
            var itemPool      = ItemPool.Construct(ExtractionSettings.ItemInput, ExtractionSettings.AssessmentInfo.Publisher);
            var testBlueprint = TestBlueprint.Construct(ExtractionSettings.ItemInput, itemPool,
                                                        ExtractionSettings.AssessmentInfo.UniqueId);
            var testForms = TestForm.Construct(ExtractionSettings.ItemInput, itemPool,
                                               ExtractionSettings.AssessmentInfo).ToList();
            var performanceLevels = PerformanceLevels.Construct(ExtractionSettings.AssessmentInfo);
            var adminSegments     = AdminSegment.Construct(itemPool, ExtractionSettings.ItemInput);

            var scoringSpecification = BuildGlobalProperties("scoring");

            scoringSpecification.Add(new XElement("scoring",
                                                  testBlueprint,
                                                  itemPool,
                                                  testForms,
                                                  performanceLevels,
                                                  scoringRules
                                                  ));
            result.Add(scoringSpecification);

            var administrationSpecification = BuildGlobalProperties("administration");

            administrationSpecification.Add(new XElement("administration",
                                                         testBlueprint,
                                                         PoolPropertyUtilities.GeneratePoolPropertyTypes(itemPool),
                                                         PoolPropertyUtilities.GeneratePoolPropertyLanguages(itemPool),
                                                         itemPool,
                                                         testForms,
                                                         adminSegments));
            result.Add(administrationSpecification);

            return(result);
        }