// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

using System.Drawing;
using System.Windows.Forms.TestUtilities;

namespace System.Windows.Forms.Tests;

// NB: doesn't require thread affinity
public class ListViewItemTests
{
    [Fact]
    public void ListViewItem_Ctor_Default()
    {
        ListViewItem item = new();
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Null(item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Equal(string.Empty, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        ListViewItem.ListViewSubItem subItem = Assert.Single(item.SubItems.Cast<ListViewItem.ListViewSubItem>());
        Assert.Empty(subItem.Text);
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Empty(item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_StringArray_String_Color_Color_Font_ListViewGroup_TestData()
    {
        yield return new object[] { null, null, Color.Empty, Color.Empty, null, null, string.Empty, SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { Array.Empty<string>(), null, Color.Empty, Color.Empty, null, null, string.Empty, SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { new string[] { null }, string.Empty, Color.Empty, Color.Empty, null, new ListViewGroup(), string.Empty, SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { new string[] { "text" }, "imageKey", Color.Blue, Color.Red, SystemFonts.MenuFont, new ListViewGroup(), "imageKey", Color.Blue, Color.Red, "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_StringArray_String_Color_Color_Font_ListViewGroup_TestData))]
    public void ListViewItem_Ctor_StringArray_String_Color_Color_Font_ListViewGroup(string[] subItems, string imageKey, Color foreColor, Color backColor, Font font, ListViewGroup group, string expectedImageKey, Color expectedForeColor, Color expectedBackColor, string expectedText)
    {
        ListViewItem item = new(subItems, imageKey, foreColor, backColor, font, group);
        Assert.Equal(expectedBackColor, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(font ?? Control.DefaultFont, item.Font);
        Assert.Equal(expectedForeColor, item.ForeColor);
        Assert.Equal(group, item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Same(expectedImageKey, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_StringArray_Int_Color_Color_Font_ListViewGroup_TestData()
    {
        yield return new object[] { null, -1, Color.Empty, Color.Empty, null, null, SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { Array.Empty<string>(), 0, Color.Empty, Color.Empty, null, null, SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { new string[] { null }, 1, Color.Empty, Color.Empty, null, new ListViewGroup(), SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { new string[] { "text" }, 2, Color.Blue, Color.Red, SystemFonts.MenuFont, new ListViewGroup(), Color.Blue, Color.Red, "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_StringArray_Int_Color_Color_Font_ListViewGroup_TestData))]
    public void ListViewItem_Ctor_StringArray_Int_Color_Color_Font_ListViewGroup(string[] subItems, int imageIndex, Color foreColor, Color backColor, Font font, ListViewGroup group, Color expectedForeColor, Color expectedBackColor, string expectedText)
    {
        ListViewItem item = new(subItems, imageIndex, foreColor, backColor, font, group);
        Assert.Equal(expectedBackColor, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(font ?? Control.DefaultFont, item.Font);
        Assert.Equal(expectedForeColor, item.ForeColor);
        Assert.Equal(group, item.Group);
        Assert.Equal(imageIndex, item.ImageIndex);
        Assert.Empty(item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_StringArray_String_Color_Color_Font_TestData()
    {
        yield return new object[] { null, null, Color.Empty, Color.Empty, null, string.Empty, SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { Array.Empty<string>(), null, Color.Empty, Color.Empty, null, string.Empty, SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { new string[] { null }, string.Empty, Color.Empty, Color.Empty, null, string.Empty, SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { new string[] { "text" }, "imageKey", Color.Blue, Color.Red, SystemFonts.MenuFont, "imageKey", Color.Blue, Color.Red, "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_StringArray_String_Color_Color_Font_TestData))]
    public void ListViewItem_Ctor_StringArray_String_Color_Color_Font(string[] subItems, string imageKey, Color foreColor, Color backColor, Font font, string expectedImageKey, Color expectedForeColor, Color expectedBackColor, string expectedText)
    {
        ListViewItem item = new(subItems, imageKey, foreColor, backColor, font);
        Assert.Equal(expectedBackColor, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(font ?? Control.DefaultFont, item.Font);
        Assert.Equal(expectedForeColor, item.ForeColor);
        Assert.Null(item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Same(expectedImageKey, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_StringArray_Int_Color_Color_Font_TestData()
    {
        yield return new object[] { null, -1, Color.Empty, Color.Empty, null, SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { Array.Empty<string>(), 0, Color.Empty, Color.Empty, null, SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { new string[] { null }, 1, Color.Empty, Color.Empty, null, SystemColors.WindowText, SystemColors.Window, string.Empty };
        yield return new object[] { new string[] { "text" }, 2, Color.Blue, Color.Red, SystemFonts.MenuFont, Color.Blue, Color.Red, "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_StringArray_Int_Color_Color_Font_TestData))]
    public void ListViewItem_Ctor_StringArray_Int_Color_Color_Font(string[] subItems, int imageIndex, Color foreColor, Color backColor, Font font, Color expectedForeColor, Color expectedBackColor, string expectedText)
    {
        ListViewItem item = new(subItems, imageIndex, foreColor, backColor, font);
        Assert.Equal(expectedBackColor, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(font ?? Control.DefaultFont, item.Font);
        Assert.Equal(expectedForeColor, item.ForeColor);
        Assert.Null(item.Group);
        Assert.Equal(imageIndex, item.ImageIndex);
        Assert.Empty(item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_ListViewSubItemArray_String_ListViewGroup_TestData()
    {
        yield return new object[] { Array.Empty<ListViewItem.ListViewSubItem>(), null, null, string.Empty, string.Empty };
        yield return new object[] { new ListViewItem.ListViewSubItem[] { new(null, "text") }, string.Empty, null, string.Empty, "text" };
        yield return new object[] { new ListViewItem.ListViewSubItem[] { new(null, "text") }, "imageKey", new ListViewGroup(), "imageKey", "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_ListViewSubItemArray_String_ListViewGroup_TestData))]
    public void ListViewItem_Ctor_ListViewSubItemArray_String_ListViewGroup(ListViewItem.ListViewSubItem[] subItems, string imageKey, ListViewGroup group, string expectedImageKey, string expectedText)
    {
        ListViewItem item = new(subItems, imageKey, group);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Equal(group, item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Same(expectedImageKey, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_ListViewSubItemArray_Int_ListViewGroup_TestData()
    {
        yield return new object[] { Array.Empty<ListViewItem.ListViewSubItem>(), 0, null, string.Empty };
        yield return new object[] { new ListViewItem.ListViewSubItem[] { new(null, "text") }, 1, null, "text" };
        yield return new object[] { new ListViewItem.ListViewSubItem[] { new(null, "text") }, -1, new ListViewGroup(), "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_ListViewSubItemArray_Int_ListViewGroup_TestData))]
    public void ListViewItem_Ctor_ListViewSubItemArray_Int_ListViewGroup(ListViewItem.ListViewSubItem[] subItems, int imageIndex, ListViewGroup group, string expectedText)
    {
        ListViewItem item = new(subItems, imageIndex, group);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Equal(group, item.Group);
        Assert.Equal(imageIndex, item.ImageIndex);
        Assert.Equal(string.Empty, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_StringArray_String_ListViewGroup_TestData()
    {
        yield return new object[] { null, null, null, string.Empty, string.Empty };
        yield return new object[] { Array.Empty<string>(), null, null, string.Empty, string.Empty };
        yield return new object[] { new string[] { null }, string.Empty, new ListViewGroup(), string.Empty, string.Empty };
        yield return new object[] { new string[] { "text" }, "imageKey", new ListViewGroup(), "imageKey", "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_StringArray_String_ListViewGroup_TestData))]
    public void ListViewItem_Ctor_StringArray_String_ListViewGroup(string[] subItems, string imageKey, ListViewGroup group, string expectedImageKey, string expectedText)
    {
        ListViewItem item = new(subItems, imageKey, group);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Equal(group, item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Same(expectedImageKey, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_StringArray_Int_ListViewGroup_TestData()
    {
        yield return new object[] { null, -1, null, string.Empty };
        yield return new object[] { Array.Empty<string>(), 0, null, string.Empty };
        yield return new object[] { new string[] { null }, 1, new ListViewGroup(), string.Empty };
        yield return new object[] { new string[] { "text" }, 2, new ListViewGroup(), "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_StringArray_Int_ListViewGroup_TestData))]
    public void ListViewItem_Ctor_StringArray_Int_ListViewGroup(string[] subItems, int imageIndex, ListViewGroup group, string expectedText)
    {
        ListViewItem item = new(subItems, imageIndex, group);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Equal(group, item.Group);
        Assert.Equal(imageIndex, item.ImageIndex);
        Assert.Empty(item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_String_String_ListViewGroup_TestData()
    {
        yield return new object[] { null, null, null, string.Empty, string.Empty };
        yield return new object[] { string.Empty, string.Empty, new ListViewGroup(), string.Empty, string.Empty };
        yield return new object[] { "text", "imageKey", new ListViewGroup(), "text", "imageKey" };
    }

    [Theory]
    [MemberData(nameof(Ctor_String_String_ListViewGroup_TestData))]
    public void ListViewItem_Ctor_String_String_ListViewGroup(string text, string imageKey, ListViewGroup group, string expectedText, string expectedImageKey)
    {
        ListViewItem item = new(text, imageKey, group);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Equal(group, item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Same(expectedImageKey, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        ListViewItem.ListViewSubItem subItem = Assert.Single(item.SubItems.Cast<ListViewItem.ListViewSubItem>());
        Assert.Same(expectedText, subItem.Text);
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_String_Int_ListViewGroup_TestData()
    {
        yield return new object[] { null, -1, null, string.Empty };
        yield return new object[] { string.Empty, 0, new ListViewGroup(), string.Empty };
        yield return new object[] { "text", 1, new ListViewGroup(), "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_String_Int_ListViewGroup_TestData))]
    public void ListViewItem_Ctor_String_Int_ListViewGroup(string text, int imageIndex, ListViewGroup group, string expectedText)
    {
        ListViewItem item = new(text, imageIndex, group);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Equal(group, item.Group);
        Assert.Equal(imageIndex, item.ImageIndex);
        Assert.Empty(item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        ListViewItem.ListViewSubItem subItem = Assert.Single(item.SubItems.Cast<ListViewItem.ListViewSubItem>());
        Assert.Same(expectedText, subItem.Text);
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_ListViewSubItemArray_String_TestData()
    {
        yield return new object[] { Array.Empty<ListViewItem.ListViewSubItem>(), null, string.Empty, string.Empty };
        yield return new object[] { new ListViewItem.ListViewSubItem[] { new(null, "text") }, string.Empty, string.Empty, "text" };
        yield return new object[] { new ListViewItem.ListViewSubItem[] { new(null, "text") }, "imageKey", "imageKey", "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_ListViewSubItemArray_String_TestData))]
    public void ListViewItem_Ctor_ListViewSubItemArray_String(ListViewItem.ListViewSubItem[] subItems, string imageKey, string expectedImageKey, string expectedText)
    {
        ListViewItem item = new(subItems, imageKey);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Null(item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Same(expectedImageKey, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_ListViewSubItemArray_Int_TestData()
    {
        yield return new object[] { Array.Empty<ListViewItem.ListViewSubItem>(), 0, string.Empty };
        yield return new object[] { new ListViewItem.ListViewSubItem[] { new(null, "text") }, 1, "text" };
        yield return new object[] { new ListViewItem.ListViewSubItem[] { new(null, "text") }, -1, "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_ListViewSubItemArray_Int_TestData))]
    public void ListViewItem_Ctor_ListViewSubItemArray_Int(ListViewItem.ListViewSubItem[] subItems, int imageIndex, string expectedText)
    {
        ListViewItem item = new(subItems, imageIndex);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Null(item.Group);
        Assert.Equal(imageIndex, item.ImageIndex);
        Assert.Equal(string.Empty, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_StringArray_ListViewGroup_TestData()
    {
        yield return new object[] { null, null, string.Empty };
        yield return new object[] { Array.Empty<string>(), null, string.Empty };
        yield return new object[] { new string[] { null }, new ListViewGroup(), string.Empty };
        yield return new object[] { new string[] { "text" }, new ListViewGroup(), "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_StringArray_ListViewGroup_TestData))]
    public void ListViewItem_Ctor_StringArray_ListViewGroup(string[] subItems, ListViewGroup group, string expectedText)
    {
        ListViewItem item = new(subItems, group);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Equal(group, item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Empty(item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_StringArray_String_TestData()
    {
        yield return new object[] { null, null, string.Empty, string.Empty };
        yield return new object[] { Array.Empty<string>(), null, string.Empty, string.Empty };
        yield return new object[] { new string[] { null }, string.Empty, string.Empty, string.Empty };
        yield return new object[] { new string[] { "text" }, "imageKey", "imageKey", "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_StringArray_String_TestData))]
    public void ListViewItem_Ctor_StringArray_String(string[] subItems, string imageKey, string expectedImageKey, string expectedText)
    {
        ListViewItem item = new(subItems, imageKey);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Null(item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Equal(expectedImageKey, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Equal(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_StringArray_Int_TestData()
    {
        yield return new object[] { null, -1, string.Empty };
        yield return new object[] { Array.Empty<string>(), 0, string.Empty };
        yield return new object[] { new string[] { null }, 1, string.Empty };
        yield return new object[] { new string[] { "text" }, 2, "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_StringArray_Int_TestData))]
    public void ListViewItem_Ctor_StringArray_Int(string[] subItems, int imageIndex, string expectedText)
    {
        ListViewItem item = new(subItems, imageIndex);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Null(item.Group);
        Assert.Equal(imageIndex, item.ImageIndex);
        Assert.Equal(string.Empty, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Equal(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_String_ListViewGroup_TestData()
    {
        yield return new object[] { null, null, string.Empty };
        yield return new object[] { string.Empty, null, string.Empty };
        yield return new object[] { "text", new ListViewGroup(), "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_String_ListViewGroup_TestData))]
    public void ListViewItem_Ctor_String_ListViewGroup(string text, ListViewGroup group, string expectedText)
    {
        ListViewItem item = new(text, group);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Equal(group, item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Equal(string.Empty, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        ListViewItem.ListViewSubItem subItem = Assert.Single(item.SubItems.Cast<ListViewItem.ListViewSubItem>());
        Assert.Same(expectedText, subItem.Text);
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Same(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_String_String_TestData()
    {
        yield return new object[] { null, null, string.Empty, string.Empty };
        yield return new object[] { string.Empty, string.Empty, string.Empty, string.Empty };
        yield return new object[] { "text", "imageKey", "text", "imageKey" };
    }

    [Theory]
    [MemberData(nameof(Ctor_String_String_TestData))]
    public void ListViewItem_Ctor_String_String(string text, string imageKey, string expectedText, string expectedImageKey)
    {
        ListViewItem item = new(text, imageKey);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Null(item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Equal(expectedImageKey, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        ListViewItem.ListViewSubItem subItem = Assert.Single(item.SubItems.Cast<ListViewItem.ListViewSubItem>());
        Assert.Equal(expectedText, subItem.Text);
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Equal(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_String_Int_TestData()
    {
        yield return new object[] { null, -1, string.Empty };
        yield return new object[] { string.Empty, 0, string.Empty };
        yield return new object[] { "text", 1, "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_String_Int_TestData))]
    public void ListViewItem_Ctor_String_Int(string text, int imageIndex, string expectedText)
    {
        ListViewItem item = new(text, imageIndex);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Null(item.Group);
        Assert.Equal(imageIndex, item.ImageIndex);
        Assert.Equal(string.Empty, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        ListViewItem.ListViewSubItem subItem = Assert.Single(item.SubItems.Cast<ListViewItem.ListViewSubItem>());
        Assert.Equal(expectedText, subItem.Text);
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Equal(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_ListViewGroup_TestData()
    {
        yield return new object[] { null };
        yield return new object[] { new ListViewGroup() };
    }

    [Theory]
    [MemberData(nameof(Ctor_ListViewGroup_TestData))]
    public void ListViewItem_Ctor_ListViewGroup(ListViewGroup group)
    {
        ListViewItem item = new(group);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Equal(group, item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Equal(string.Empty, item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        ListViewItem.ListViewSubItem subItem = Assert.Single(item.SubItems.Cast<ListViewItem.ListViewSubItem>());
        Assert.Empty(subItem.Text);
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Empty(item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    public static IEnumerable<object[]> Ctor_StringArray_TestData()
    {
        yield return new object[] { null, string.Empty };
        yield return new object[] { Array.Empty<string>(), string.Empty };
        yield return new object[] { new string[] { null }, string.Empty };
        yield return new object[] { new string[] { "text" }, "text" };
    }

    [Theory]
    [MemberData(nameof(Ctor_StringArray_TestData))]
    public void ListViewItem_Ctor_StringArray(string[] subItems, string expectedText)
    {
        ListViewItem item = new(subItems);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Null(item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Empty(item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        AssertEqualListViewSubItem(subItems, item.SubItems.Cast<ListViewItem.ListViewSubItem>().ToArray());
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Equal(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    [Theory]
    [NormalizedStringData]
    public void ListViewItem_Ctor_String(string text, string expectedText)
    {
        ListViewItem item = new(text);
        Assert.Equal(SystemColors.Window, item.BackColor);
        Assert.Equal(Rectangle.Empty, item.Bounds);
        Assert.False(item.Checked);
        Assert.False(item.Focused);
        Assert.Equal(Control.DefaultFont, item.Font);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
        Assert.Null(item.Group);
        Assert.Equal(-1, item.ImageIndex);
        Assert.Empty(item.ImageKey);
        Assert.Null(item.ImageList);
        Assert.Equal(0, item.IndentCount);
        Assert.Equal(-1, item.Index);
        Assert.Null(item.ListView);
        Assert.Empty(item.Name);
        Assert.Equal(new Point(-1, -1), item.Position);
        Assert.False(item.Selected);
        Assert.Equal(-1, item.StateImageIndex);
        ListViewItem.ListViewSubItem subItem = Assert.Single(item.SubItems.Cast<ListViewItem.ListViewSubItem>());
        Assert.Equal(expectedText, subItem.Text);
        Assert.Same(item.SubItems, item.SubItems);
        Assert.Null(item.Tag);
        Assert.Equal(expectedText, item.Text);
        Assert.Empty(item.ToolTipText);
        Assert.True(item.UseItemStyleForSubItems);
    }

    [Fact]
    public void ListViewItem_Ctor_NullSubItems_ThrowsArgumentNullException()
    {
        Assert.Throws<ArgumentNullException>("subItems", () => new ListViewItem((ListViewItem.ListViewSubItem[])null, "imageKey"));
        Assert.Throws<ArgumentNullException>("subItems", () => new ListViewItem((ListViewItem.ListViewSubItem[])null, 1));
        Assert.Throws<ArgumentNullException>("subItems", () => new ListViewItem((ListViewItem.ListViewSubItem[])null, "imageKey", new ListViewGroup()));
        Assert.Throws<ArgumentNullException>("subItems", () => new ListViewItem((ListViewItem.ListViewSubItem[])null, 0, new ListViewGroup()));
    }

    [Fact]
    public void ListViewItem_Ctor_NullValueInSubItems_ThrowsArgumentNullException()
    {
        var subItems = new ListViewItem.ListViewSubItem[] { null };
        Assert.Throws<ArgumentNullException>("subItems", () => new ListViewItem(subItems, "imageKey"));
        Assert.Throws<ArgumentNullException>("subItems", () => new ListViewItem(subItems, 1));
        Assert.Throws<ArgumentNullException>("subItems", () => new ListViewItem(subItems, "imageKey", new ListViewGroup()));
        Assert.Throws<ArgumentNullException>("subItems", () => new ListViewItem(subItems, 1, new ListViewGroup()));
    }

    public static IEnumerable<object[]> BackColor_Set_TestData()
    {
        yield return new object[] { Color.Empty, SystemColors.Window };
        yield return new object[] { Color.Red, Color.Red };
    }

    [WinFormsTheory]
    [MemberData(nameof(BackColor_Set_TestData))]
    public void ListViewItem_BackColor_GetWithOwner_ReturnsExpected(Color value, Color expected)
    {
        using ListView listView = new()
        {
            BackColor = value
        };

        ListViewItem item = new();
        listView.Items.Add(item);
        Assert.Equal(expected, item.BackColor);

        // Remove item.
        listView.Items.Remove(item);
        Assert.Equal(SystemColors.Window, item.BackColor);
    }

    [Theory]
    [MemberData(nameof(BackColor_Set_TestData))]
    public void ListViewItem_BackColor_Set_GetReturnsExpected(Color value, Color expected)
    {
        ListViewItem item = new()
        {
            BackColor = value
        };
        Assert.Equal(expected, item.BackColor);

        // Set same.
        item.BackColor = value;
        Assert.Equal(expected, item.BackColor);
    }

    [WinFormsTheory]
    [MemberData(nameof(BackColor_Set_TestData))]
    public void ListViewItem_BackColor_SetWithOwner_GetReturnsExpected(Color value, Color expected)
    {
        using ListView listView = new();
        ListViewItem item = new();
        listView.Items.Add(item);

        item.BackColor = value;
        Assert.Equal(expected, item.BackColor);

        // Set same.
        item.BackColor = value;
        Assert.Equal(expected, item.BackColor);
    }

    public static IEnumerable<object[]> ForeColor_Set_TestData()
    {
        yield return new object[] { Color.Empty, SystemColors.WindowText };
        yield return new object[] { Color.White, Color.White };
        yield return new object[] { Color.Black, Color.Black };
        yield return new object[] { Color.Red, Color.Red };
    }

    [WinFormsTheory]
    [MemberData(nameof(ForeColor_Set_TestData))]
    public void ListViewItem_ForeColor_GetWithOwner_ReturnsExpected(Color value, Color expected)
    {
        using ListView listView = new()
        {
            ForeColor = value
        };

        ListViewItem item = new();
        listView.Items.Add(item);
        Assert.Equal(expected, item.ForeColor);

        // Remove item.
        listView.Items.Remove(item);
        Assert.Equal(SystemColors.WindowText, item.ForeColor);
    }

    [Theory]
    [MemberData(nameof(ForeColor_Set_TestData))]
    public void ListViewItem_ForeColor_Set_GetReturnsExpected(Color value, Color expected)
    {
        ListViewItem item = new()
        {
            ForeColor = value
        };

        Assert.Equal(expected, item.ForeColor);

        // Set same.
        item.ForeColor = value;
        Assert.Equal(expected, item.ForeColor);
    }

    [WinFormsTheory]
    [MemberData(nameof(ForeColor_Set_TestData))]
    public void ListViewItem_ForeColor_SetWithOwner_GetReturnsExpected(Color value, Color expected)
    {
        using ListView listView = new();
        ListViewItem item = new();
        listView.Items.Add(item);

        item.ForeColor = value;
        Assert.Equal(expected, item.ForeColor);

        // Set same.
        item.ForeColor = value;
        Assert.Equal(expected, item.ForeColor);
    }

    [WinFormsTheory]
    [CommonMemberData(typeof(CommonTestHelperEx), nameof(CommonTestHelperEx.GetFontTheoryData))]
    public void ListViewItem_Font_GetWithOwner_ReturnsExpected(Font value)
    {
        using ListView listView = new()
        {
            Font = value
        };

        ListViewItem item = new();
        listView.Items.Add(item);
        Assert.Equal(value ?? Control.DefaultFont, item.Font);

        // Remove item.
        listView.Items.Remove(item);
        Assert.Equal(Control.DefaultFont, item.Font);
    }

    [Theory]
    [CommonMemberData(typeof(CommonTestHelperEx), nameof(CommonTestHelperEx.GetFontTheoryData))]
    public void ListViewItem_Font_Set_GetReturnsExpected(Font value)
    {
        ListViewItem item = new()
        {
            Font = value
        };

        Assert.Equal(value ?? Control.DefaultFont, item.Font);

        // Set same.
        item.Font = value;
        Assert.Equal(value ?? Control.DefaultFont, item.Font);
    }

    [WinFormsTheory]
    [CommonMemberData(typeof(CommonTestHelperEx), nameof(CommonTestHelperEx.GetFontTheoryData))]
    public void ListViewItem_Font_SetWithOwner_GetReturnsExpected(Font value)
    {
        using ListView listView = new()
        {
            Font = SystemFonts.CaptionFont
        };

        ListViewItem item = new();
        listView.Items.Add(item);

        item.Font = value;
        Assert.Equal(value ?? SystemFonts.CaptionFont, item.Font);

        // Set same.
        item.Font = value;
        Assert.Equal(value ?? SystemFonts.CaptionFont, item.Font);
    }

    [WinFormsFact]
    public void ListViewItem_EnsureVisible_HasListViewWithoutHandle_Nop()
    {
        using ListView listView = new();
        ListViewItem item = new();
        listView.Items.Add(item);
        item.EnsureVisible();
    }

    [Fact]
    public void ListViewItem_EnsureVisible_NoListView_Nop()
    {
        ListViewItem item = new();
        item.EnsureVisible();
    }

    [WinFormsFact]
    public void ListViewItem_Remove_HasListView_Success()
    {
        using ListView listView = new();
        ListViewItem item = new();
        listView.Items.Add(item);
        item.Remove();
        Assert.Empty(listView.Items);
        Assert.Null(item.ListView);
    }

    [Fact]
    public void ListViewItem_Remove_NoListView_Nop()
    {
        ListViewItem item = new();
        item.Remove();
    }

    private static void AssertEqualListViewSubItem(string[] expected, ListViewItem.ListViewSubItem[] actual)
    {
        AssertEqualListViewSubItem(expected?.Select(t => new ListViewItem.ListViewSubItem(null, t)).ToArray(), actual);
    }

    private static void AssertEqualListViewSubItem(ListViewItem.ListViewSubItem[] expected, ListViewItem.ListViewSubItem[] actual)
    {
        if (expected is null || expected.Length == 0)
        {
            ListViewItem.ListViewSubItem subItem = Assert.Single(actual.Cast<ListViewItem.ListViewSubItem>());
            Assert.Empty(subItem.Text);
            return;
        }

        Assert.Equal(expected.Length, actual.Length);
        for (int i = 0; i < expected.Length; i++)
        {
            Assert.Equal(expected[i].Name, actual[i].Name);
            Assert.Equal(expected[i].Text, actual[i].Text);
            Assert.Equal(expected[i].Tag, actual[i].Tag);
        }
    }

    [Fact]
    public void ListViewItem_AccessibilityObject_ThrowsInvalidOperationException_IfListViewNotExists()
    {
        ListViewItem item = new();

        Assert.Throws<InvalidOperationException>(() => item.AccessibilityObject);
    }

    [WinFormsFact]
    public void ListViewItem_AccessibilityObject_ReturnsExpected_IfListViewExists()
    {
        using ListView listView = new();
        ListViewItem item = new();
        listView.Items.Add(item);

        Assert.NotNull(item.AccessibilityObject);
    }

    [WinFormsFact]
    public void ListViewItem_AccessibilityObject_ThrowsInvalidOperationException_IfRemoved()
    {
        using ListView listView = new();
        ListViewItem item = new();
        listView.Items.Add(item);

        Assert.NotNull(item.AccessibilityObject);

        listView.Items.RemoveAt(0);

        Assert.Throws<InvalidOperationException>(() => item.AccessibilityObject);
    }

    [WinFormsFact]
    public void ListViewItem_AccessibilityObject_ThrowsInvalidOperationException_IfCleared()
    {
        using ListView listView = new();
        ListViewItem item = new();
        listView.Items.Add(item);

        Assert.NotNull(item.AccessibilityObject);

        listView.Items.Clear();

        Assert.Throws<InvalidOperationException>(() => item.AccessibilityObject);
    }
}
