public void ImportRowTest()
{
// build source table
DataTable src = new DataTable();
src.Columns.Add("id", typeof(int));
src.Columns.Add("name", typeof(string));
src.PrimaryKey = new DataColumn[] { src.Columns[0] };
src.Rows.Add(new object[] { 1, "mono 1" });
src.Rows.Add(new object[] { 2, "mono 2" });
src.Rows.Add(new object[] { 3, "mono 3" });
src.AcceptChanges();
src.Rows[0][1] = "mono changed 1"; // modify 1st row
src.Rows[1].Delete(); // delete 2nd row
// 3rd row is unchanged
src.Rows.Add(new object[] { 4, "mono 4" }); // add 4th row
// build target table
DataTable target = new DataTable();
target.Columns.Add("id", typeof(int));
target.Columns.Add("name", typeof(string));
target.PrimaryKey = new DataColumn[] { target.Columns[0] };
// import all rows
target.ImportRow(src.Rows[0]); // import 1st row
target.ImportRow(src.Rows[1]); // import 2nd row
target.ImportRow(src.Rows[2]); // import 3rd row
target.ImportRow(src.Rows[3]); // import 4th row
try
{
target.ImportRow(src.Rows[2]); // import 3rd row again
Assert.False(true);
}
catch (ConstraintException ex)
{
// Column 'id' is constrained to be unique.
// Value '3' is already present
Assert.Equal(typeof(ConstraintException), ex.GetType());
Assert.Null(ex.InnerException);
Assert.NotNull(ex.Message);
Assert.True(ex.Message.IndexOf("'id'") != -1);
Assert.True(ex.Message.IndexOf("'3'") != -1);
}
// check row states
Assert.Equal(src.Rows[0].RowState, target.Rows[0].RowState);
Assert.Equal(src.Rows[1].RowState, target.Rows[1].RowState);
Assert.Equal(src.Rows[2].RowState, target.Rows[2].RowState);
Assert.Equal(src.Rows[3].RowState, target.Rows[3].RowState);
// check for modified row (1st row)
Assert.Equal((string)src.Rows[0][1], (string)target.Rows[0][1]);
Assert.Equal((string)src.Rows[0][1, DataRowVersion.Default], (string)target.Rows[0][1, DataRowVersion.Default]);
Assert.Equal((string)src.Rows[0][1, DataRowVersion.Original], (string)target.Rows[0][1, DataRowVersion.Original]);
Assert.Equal((string)src.Rows[0][1, DataRowVersion.Current], (string)target.Rows[0][1, DataRowVersion.Current]);
Assert.False(target.Rows[0].HasVersion(DataRowVersion.Proposed));
// check for deleted row (2nd row)
Assert.Equal((string)src.Rows[1][1, DataRowVersion.Original], (string)target.Rows[1][1, DataRowVersion.Original]);
// check for unchanged row (3rd row)
Assert.Equal((string)src.Rows[2][1], (string)target.Rows[2][1]);
Assert.Equal((string)src.Rows[2][1, DataRowVersion.Default], (string)target.Rows[2][1, DataRowVersion.Default]);
Assert.Equal((string)src.Rows[2][1, DataRowVersion.Original], (string)target.Rows[2][1, DataRowVersion.Original]);
Assert.Equal((string)src.Rows[2][1, DataRowVersion.Current], (string)target.Rows[2][1, DataRowVersion.Current]);
// check for newly added row (4th row)
Assert.Equal((string)src.Rows[3][1], (string)target.Rows[3][1]);
Assert.Equal((string)src.Rows[3][1, DataRowVersion.Default], (string)target.Rows[3][1, DataRowVersion.Default]);
Assert.Equal((string)src.Rows[3][1, DataRowVersion.Current], (string)target.Rows[3][1, DataRowVersion.Current]);
}