<script src="../../../resources/js-test-pre.js"></script>
<script src="../resources/media-controls-loader.js" type="text/javascript"></script>
<body>
<script type="text/javascript">

description("Populating a <code>TracksPanel</code> instance.");

const tracksPanel = new TracksPanel;

const numberOfSections = 2;
const numberOfTracksInSection = [3, 5];
const selectedTracks = [[0, 1], [1, 3]];

tracksPanel.dataSource = {
    tracksPanelNumberOfSections: function()
    {
        return numberOfSections;
    },

    tracksPanelTitleForSection: function(sectionIndex)
    {
        return `Title #${sectionIndex}`;
    },

    tracksPanelNumberOfTracksInSection: function(sectionIndex)
    {
        return numberOfTracksInSection[sectionIndex];
    },

    tracksPanelTitleForTrackInSection: function(trackIndex, sectionIndex)
    {
        return `Track ${sectionIndex}x${trackIndex}`;
    },

    tracksPanelIsTrackInSectionSelected: function(trackIndex, sectionIndex)
    {
        return selectedTracks.some(selectedTrack => selectedTrack[0] === sectionIndex && selectedTrack[1] === trackIndex);
    }
};

const container = new LayoutNode;
tracksPanel.presentInParent(container);

const scrollContainer = tracksPanel.children[1];

shouldBeTrue("tracksPanel.presented");
shouldBe("tracksPanel.parent", "container");
shouldBe("scrollContainer.children.length", "numberOfSections");

let sectionIndex, trackIndex;
for (sectionIndex = 0; sectionIndex < numberOfSections; ++sectionIndex) {
    debug("");
    debug(`Hierarchy for section #${sectionIndex}`);
    shouldBeEqualToString(`scrollContainer.children[${sectionIndex}].element.localName`, "section");
    shouldBe(`scrollContainer.children[${sectionIndex}].children.length`, "2");
    shouldBeEqualToString(`scrollContainer.children[${sectionIndex}].children[0].element.localName`, "h3");
    shouldBeEqualToString(`scrollContainer.children[${sectionIndex}].children[0].element.textContent`, tracksPanel.dataSource.tracksPanelTitleForSection(sectionIndex));
    shouldBeEqualToString(`scrollContainer.children[${sectionIndex}].children[1].element.localName`, "ul");
    shouldBe(`scrollContainer.children[${sectionIndex}].children[1].children.length`, `${numberOfTracksInSection[sectionIndex]}`);
    for (trackIndex = 0; trackIndex < numberOfTracksInSection[sectionIndex]; ++trackIndex) {
        shouldBeEqualToString(`scrollContainer.children[${sectionIndex}].children[1].children[trackIndex].element.localName`, "li");
        shouldBeEqualToString(`scrollContainer.children[${sectionIndex}].children[1].children[trackIndex].element.className`, selectedTracks.some(selectedTrack => selectedTrack[0] === sectionIndex && selectedTrack[1] === trackIndex) ? "selected" : "");
        shouldBeEqualToString(`scrollContainer.children[${sectionIndex}].children[1].children[trackIndex].element.textContent`, tracksPanel.dataSource.tracksPanelTitleForTrackInSection(trackIndex, sectionIndex));
    }
}

debug("");

</script>
<script src="../../../resources/js-test-post.js"></script>
</body>
