File: DataFrameInteractiveTests.cs
Web Access
Project: src\test\Microsoft.Data.Analysis.Interactive.Tests\Microsoft.Data.Analysis.Interactive.Tests.csproj (Microsoft.Data.Analysis.Interactive.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.DotNet.Interactive.Formatting;
using Microsoft.DotNet.Interactive.Formatting.TabularData;
using Xunit;
 
namespace Microsoft.Data.Analysis.Interactive.Tests
{
    public class DataFrameInteractiveTests
    {
        private Regex _buttonHtmlPart = new Regex(@"<\s*button.*onclick=.*>");
        private const string TableHtmlPart = "<table";
 
        public static DataFrame MakeDataFrameWithTwoColumns(int length, bool withNulls = true)
        {
            DataFrameColumn dataFrameColumn1 = new Int32DataFrameColumn("Int1", Enumerable.Range(0, length).Select(x => x));
            DataFrameColumn dataFrameColumn2 = new Int32DataFrameColumn("Int2", Enumerable.Range(10, length).Select(x => x));
            if (withNulls)
            {
                dataFrameColumn1[length / 2] = null;
                dataFrameColumn2[length / 2] = null;
            }
            DataFrame dataFrame = new DataFrame();
            dataFrame.Columns.Insert(0, dataFrameColumn1);
            dataFrame.Columns.Insert(1, dataFrameColumn2);
            return dataFrame;
        }
 
        [Fact]
        public void LessThanOnePageDataFrameTest()
        {
            DataFrame dataFrame = MakeDataFrameWithTwoColumns(length: 5);
            DataFrameKernelExtension.RegisterDataFrame();
            var html = dataFrame.ToDisplayString("text/html");
 
            Assert.Contains(TableHtmlPart, html);
            Assert.DoesNotMatch(_buttonHtmlPart, html);
        }
 
        [Fact]
        public void MoreThanOnePageDataFrameTest()
        {
            DataFrame dataFrame = MakeDataFrameWithTwoColumns(length: 26);
            DataFrameKernelExtension.RegisterDataFrame();
            var html = dataFrame.ToDisplayString("text/html");
 
            Assert.Contains(TableHtmlPart, html);
            Assert.Matches(_buttonHtmlPart, html);
        }
 
        [Fact]
        public void DataFrameInfoTest()
        {
            DataFrame dataFrame = MakeDataFrameWithTwoColumns(length: 5);
            DataFrameKernelExtension.RegisterDataFrame();
            var html = dataFrame.Info().ToDisplayString("text/html");
 
            Assert.Contains(TableHtmlPart, html);
            Assert.DoesNotMatch(_buttonHtmlPart, html);
        }
 
        [Fact]
        public void LoadFromTabularDataResource()
        {
            var schema = new TableSchema();
            schema.Fields.Add(new TableSchemaFieldDescriptor("TrueOrFalse", TableSchemaFieldType.Boolean));
            schema.Fields.Add(new TableSchemaFieldDescriptor("Integer", TableSchemaFieldType.Integer));
            schema.Fields.Add(new TableSchemaFieldDescriptor("Double", TableSchemaFieldType.Number));
            schema.Fields.Add(new TableSchemaFieldDescriptor("Text", TableSchemaFieldType.String));
            var data = new List<IDictionary<string, object>>();
 
            for (var i = 0; i < 5; i++)
            {
                data.Add(new Dictionary<string, object>
                {
                    ["TrueOrFalse"] = ((i % 2) == 0),
                    ["Integer"] = i,
                    ["Double"] = i / 0.5,
                    ["Text"] = $"hello {i}!"
                });
            }
 
            var tableData = new TabularDataResource(schema, data);
 
            var dataFrame = tableData.ToDataFrame();
            Assert.Equal(dataFrame.Columns.Select(c => c.Name).ToArray(), new[] { "TrueOrFalse", "Integer", "Double", "Text" });
        }
    }
}