https://git.reactos.org/?p=reactos.git;a=commitdiff;h=693fc866461dd716e9d44…
commit 693fc866461dd716e9d44e397369c8975541bd9b
Author: winesync <ros-dev(a)reactos.org>
AuthorDate: Sun Mar 13 00:16:41 2022 +0100
Commit: Mark Jansen <mark.jansen(a)reactos.org>
CommitDate: Sun Mar 20 19:28:12 2022 +0100
[WINESYNC] msi/tests: Add more tests for MSIMODIFY_MERGE.
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
wine commit id 535983743c6e7bccb515a823f2e9bf721740aada by Zebediah Figura
<z.figura12(a)gmail.com>
---
modules/rostests/winetests/msi/db.c | 198 ++++++++++++++++++++++++++++++++++++
1 file changed, 198 insertions(+)
diff --git a/modules/rostests/winetests/msi/db.c b/modules/rostests/winetests/msi/db.c
index f219b9a9a3f..2ff9fe2a5ef 100644
--- a/modules/rostests/winetests/msi/db.c
+++ b/modules/rostests/winetests/msi/db.c
@@ -8670,6 +8670,203 @@ static void test_primary_keys(void)
DeleteFileA(msifile);
}
+static void test_viewmodify_merge(void)
+{
+ MSIHANDLE view, rec, db = create_db();
+ UINT r;
+
+ r = run_query(db, 0, "CREATE TABLE `T` (`A` SHORT, `B` SHORT PRIMARY KEY
`A`)");
+ ok(!r, "got %u\n", r);
+ r = run_query(db, 0, "INSERT INTO `T` (`A`, `B`) VALUES (1, 2)");
+ ok(!r, "got %u\n", r);
+
+ r = MsiDatabaseOpenViewA(db, "SELECT * FROM `T`", &view);
+ ok(!r, "got %u\n", r);
+ r = MsiViewExecute(view, 0);
+ ok(!r, "got %u\n", r);
+
+ rec = MsiCreateRecord(2);
+ MsiRecordSetInteger(rec, 1, 1);
+ MsiRecordSetInteger(rec, 2, 2);
+ r = MsiViewModify(view, MSIMODIFY_MERGE, rec);
+ ok(!r, "got %u\n", r);
+
+ MsiCloseHandle(rec);
+ MsiCloseHandle(view);
+
+ r = MsiDatabaseOpenViewA(db, "SELECT * FROM `T`", &view);
+ ok(!r, "got %u\n", r);
+ r = MsiViewExecute(view, 0);
+ ok(!r, "got %u\n", r);
+
+ r = MsiViewFetch(view, &rec);
+ ok(!r, "got %u\n", r);
+ check_record(rec, 2, "1", "2");
+ MsiCloseHandle(rec);
+
+ r = MsiViewFetch(view, &rec);
+ ok(r == ERROR_NO_MORE_ITEMS, "got %u\n", r);
+ MsiCloseHandle(view);
+
+ r = MsiDatabaseOpenViewA(db, "SELECT * FROM `T`", &view);
+ ok(!r, "got %u\n", r);
+ r = MsiViewExecute(view, 0);
+ ok(!r, "got %u\n", r);
+
+ rec = MsiCreateRecord(2);
+ MsiRecordSetInteger(rec, 1, 1);
+ MsiRecordSetInteger(rec, 2, 3);
+ r = MsiViewModify(view, MSIMODIFY_MERGE, rec);
+todo_wine
+ ok(r == ERROR_FUNCTION_FAILED, "got %u\n", r);
+
+ MsiRecordSetInteger(rec, 1, 2);
+ r = MsiViewModify(view, MSIMODIFY_MERGE, rec);
+ ok(!r, "got %u\n", r);
+
+ MsiCloseHandle(rec);
+ MsiCloseHandle(view);
+
+ r = MsiDatabaseOpenViewA(db, "SELECT * FROM `T`", &view);
+ ok(!r, "got %u\n", r);
+ r = MsiViewExecute(view, 0);
+ ok(!r, "got %u\n", r);
+
+ r = MsiViewFetch(view, &rec);
+ ok(!r, "got %u\n", r);
+ check_record(rec, 2, "1", "2");
+ MsiCloseHandle(rec);
+
+ r = MsiViewFetch(view, &rec);
+ ok(!r, "got %u\n", r);
+ check_record(rec, 2, "2", "3");
+ MsiCloseHandle(rec);
+
+ r = MsiViewFetch(view, &rec);
+ ok(r == ERROR_NO_MORE_ITEMS, "got %u\n", r);
+ MsiCloseHandle(view);
+
+ r = run_query(db, 0, "CREATE TABLE `U` (`A` SHORT, `B` SHORT, `C` SHORT, `D`
SHORT PRIMARY KEY `A`, `B`)");
+ ok(!r, "got %u\n", r);
+ r = run_query(db, 0, "INSERT INTO `U` (`A`, `B`, `C`, `D`) VALUES (1, 2, 3,
4)");
+ ok(!r, "got %u\n", r);
+
+ r = MsiDatabaseOpenViewA(db, "SELECT * FROM `U`", &view);
+ ok(!r, "got %u\n", r);
+ r = MsiViewExecute(view, 0);
+ ok(!r, "got %u\n", r);
+
+ rec = MsiCreateRecord(4);
+ MsiRecordSetInteger(rec, 1, 1);
+ MsiRecordSetInteger(rec, 2, 2);
+ MsiRecordSetInteger(rec, 3, 3);
+ MsiRecordSetInteger(rec, 4, 4);
+ r = MsiViewModify(view, MSIMODIFY_MERGE, rec);
+ ok(!r, "got %u\n", r);
+
+ MsiRecordSetInteger(rec, 3, 4);
+ r = MsiViewModify(view, MSIMODIFY_MERGE, rec);
+todo_wine
+ ok(r == ERROR_FUNCTION_FAILED, "got %u\n", r);
+
+ MsiRecordSetInteger(rec, 2, 4);
+ r = MsiViewModify(view, MSIMODIFY_MERGE, rec);
+ ok(!r, "got %u\n", r);
+
+ MsiCloseHandle(rec);
+ MsiCloseHandle(view);
+
+ r = MsiDatabaseOpenViewA(db, "SELECT * FROM `U`", &view);
+ ok(!r, "got %u\n", r);
+ r = MsiViewExecute(view, 0);
+ ok(!r, "got %u\n", r);
+
+ r = MsiViewFetch(view, &rec);
+ ok(!r, "got %u\n", r);
+ check_record(rec, 4, "1", "2", "3", "4");
+ MsiCloseHandle(rec);
+
+ r = MsiViewFetch(view, &rec);
+ ok(!r, "got %u\n", r);
+ check_record(rec, 4, "1", "4", "4", "4");
+ MsiCloseHandle(rec);
+
+ r = MsiViewFetch(view, &rec);
+ ok(r == ERROR_NO_MORE_ITEMS, "got %u\n", r);
+ MsiCloseHandle(view);
+
+ r = MsiDatabaseOpenViewA(db, "SELECT `A`,`C` FROM `U`", &view);
+ ok(!r, "got %u\n", r);
+ r = MsiViewExecute(view, 0);
+ ok(!r, "got %u\n", r);
+
+ rec = MsiCreateRecord(2);
+ MsiRecordSetInteger(rec, 1, 1);
+ MsiRecordSetInteger(rec, 2, 2);
+ r = MsiViewModify(view, MSIMODIFY_MERGE, rec);
+ ok(!r, "got %u\n", r);
+
+ r = MsiViewModify(view, MSIMODIFY_MERGE, rec);
+ ok(!r, "got %u\n", r);
+
+ MsiRecordSetInteger(rec, 2, 3);
+ r = MsiViewModify(view, MSIMODIFY_MERGE, rec);
+todo_wine
+ ok(r == ERROR_FUNCTION_FAILED, "got %u\n", r);
+
+ MsiCloseHandle(rec);
+ MsiCloseHandle(view);
+
+ r = MsiDatabaseOpenViewA(db, "SELECT * FROM `U` ORDER BY `B`", &view);
+ ok(!r, "got %u\n", r);
+ r = MsiViewExecute(view, 0);
+ ok(!r, "got %u\n", r);
+
+ r = MsiViewFetch(view, &rec);
+ ok(!r, "got %u\n", r);
+ check_record(rec, 4, "1", "", "2", "");
+ MsiCloseHandle(rec);
+
+ r = MsiViewFetch(view, &rec);
+ ok(!r, "got %u\n", r);
+ check_record(rec, 4, "1", "2", "3", "4");
+ MsiCloseHandle(rec);
+
+ r = MsiViewFetch(view, &rec);
+ ok(!r, "got %u\n", r);
+ check_record(rec, 4, "1", "4", "4", "4");
+ MsiCloseHandle(rec);
+
+ r = MsiViewFetch(view, &rec);
+ ok(r == ERROR_NO_MORE_ITEMS, "got %u\n", r);
+ MsiCloseHandle(view);
+
+ r = MsiDatabaseOpenViewA(db, "SELECT `A`,`B`,`C` FROM `U`", &view);
+ ok(!r, "got %u\n", r);
+ r = MsiViewExecute(view, 0);
+ ok(!r, "got %u\n", r);
+
+ rec = MsiCreateRecord(3);
+ MsiRecordSetInteger(rec, 1, 1);
+ MsiRecordSetInteger(rec, 2, 2);
+ MsiRecordSetInteger(rec, 3, 3);
+ r = MsiViewModify(view, MSIMODIFY_MERGE, rec);
+todo_wine
+ ok(r == ERROR_FUNCTION_FAILED, "got %u\n", r);
+
+ MsiRecordSetInteger(rec, 1, 1);
+ MsiRecordSetInteger(rec, 2, MSI_NULL_INTEGER);
+ MsiRecordSetInteger(rec, 3, 2);
+ r = MsiViewModify(view, MSIMODIFY_MERGE, rec);
+ ok(!r, "got %u\n", r);
+
+ MsiCloseHandle(rec);
+ MsiCloseHandle(view);
+
+ MsiCloseHandle(db);
+ DeleteFileA(msifile);
+}
+
START_TEST(db)
{
test_msidatabase();
@@ -8726,4 +8923,5 @@ START_TEST(db)
test_embedded_nulls();
test_select_column_names();
test_primary_keys();
+ test_viewmodify_merge();
}