@@ -264,6 +264,155 @@ TEST_F(TableMetadataBuilderTest, TableRequirementAssertCurrentSchemaIDNotSet) {
264264 EXPECT_THAT (status, HasErrorMessage (" schema ID is not set" ));
265265}
266266
267+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertDoesNotExistSuccess) {
268+ table::AssertDoesNotExist requirement;
269+
270+ ASSERT_THAT (requirement.Validate (nullptr ), IsOk ());
271+ }
272+
273+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertDoesNotExistTableExists) {
274+ table::AssertDoesNotExist requirement;
275+
276+ auto status = requirement.Validate (base_metadata_.get ());
277+ EXPECT_THAT (status, IsError (ErrorKind::kCommitFailed ));
278+ EXPECT_THAT (status, HasErrorMessage (" table already exists" ));
279+ }
280+
281+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertRefSnapshotIDSuccess) {
282+ auto ref = std::make_shared<SnapshotRef>();
283+ ref->snapshot_id = 100 ;
284+ ref->retention = SnapshotRef::Branch{};
285+ base_metadata_->refs [" main" ] = ref;
286+
287+ table::AssertRefSnapshotID requirement (" main" , 100 );
288+
289+ ASSERT_THAT (requirement.Validate (base_metadata_.get ()), IsOk ());
290+ }
291+
292+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertRefSnapshotIDMismatch) {
293+ auto ref = std::make_shared<SnapshotRef>();
294+ ref->snapshot_id = 100 ;
295+ ref->retention = SnapshotRef::Branch{};
296+ base_metadata_->refs [" main" ] = ref;
297+
298+ table::AssertRefSnapshotID requirement (" main" , 200 );
299+
300+ auto status = requirement.Validate (base_metadata_.get ());
301+ EXPECT_THAT (status, IsError (ErrorKind::kCommitFailed ));
302+ EXPECT_THAT (status, HasErrorMessage (" has changed" ));
303+ }
304+
305+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertRefSnapshotIDRefMissing) {
306+ table::AssertRefSnapshotID requirement (" missing-ref" , 100 );
307+
308+ auto status = requirement.Validate (base_metadata_.get ());
309+ EXPECT_THAT (status, IsError (ErrorKind::kCommitFailed ));
310+ EXPECT_THAT (status, HasErrorMessage (" is missing" ));
311+ }
312+
313+ // Removed TableRequirementAssertRefSnapshotIDNullBase test
314+ // Java implementation doesn't check for null base, so passing nullptr would cause
315+ // undefined behavior This matches Java's assumption that base is never null when Validate
316+ // is called
317+
318+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertRefSnapshotIDNulloptSuccess) {
319+ // Ref should not exist, and it doesn't
320+ table::AssertRefSnapshotID requirement (" nonexistent" , std::nullopt );
321+
322+ ASSERT_THAT (requirement.Validate (base_metadata_.get ()), IsOk ());
323+ }
324+
325+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertRefSnapshotIDNulloptButExists) {
326+ auto ref = std::make_shared<SnapshotRef>();
327+ ref->snapshot_id = 100 ;
328+ ref->retention = SnapshotRef::Branch{};
329+ base_metadata_->refs [" main" ] = ref;
330+
331+ table::AssertRefSnapshotID requirement (" main" , std::nullopt );
332+
333+ auto status = requirement.Validate (base_metadata_.get ());
334+ EXPECT_THAT (status, IsError (ErrorKind::kCommitFailed ));
335+ EXPECT_THAT (status, HasErrorMessage (" created concurrently" ));
336+ }
337+
338+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertLastAssignedFieldIdSuccess) {
339+ base_metadata_->last_column_id = 10 ;
340+ table::AssertLastAssignedFieldId requirement (10 );
341+
342+ ASSERT_THAT (requirement.Validate (base_metadata_.get ()), IsOk ());
343+ }
344+
345+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertLastAssignedFieldIdMismatch) {
346+ base_metadata_->last_column_id = 10 ;
347+ table::AssertLastAssignedFieldId requirement (15 );
348+
349+ auto status = requirement.Validate (base_metadata_.get ());
350+ EXPECT_THAT (status, IsError (ErrorKind::kCommitFailed ));
351+ EXPECT_THAT (status, HasErrorMessage (" last assigned field ID does not match" ));
352+ }
353+
354+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertLastAssignedFieldIdNullBase) {
355+ table::AssertLastAssignedFieldId requirement (10 );
356+
357+ EXPECT_THAT (requirement.Validate (nullptr ), IsOk ());
358+ }
359+
360+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertLastAssignedPartitionIdSuccess) {
361+ base_metadata_->last_partition_id = 5 ;
362+ table::AssertLastAssignedPartitionId requirement (5 );
363+
364+ ASSERT_THAT (requirement.Validate (base_metadata_.get ()), IsOk ());
365+ }
366+
367+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertLastAssignedPartitionIdMismatch) {
368+ base_metadata_->last_partition_id = 5 ;
369+ table::AssertLastAssignedPartitionId requirement (8 );
370+
371+ auto status = requirement.Validate (base_metadata_.get ());
372+ EXPECT_THAT (status, IsError (ErrorKind::kCommitFailed ));
373+ EXPECT_THAT (status, HasErrorMessage (" last assigned partition ID does not match" ));
374+ }
375+
376+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertLastAssignedPartitionIdNullBase) {
377+ table::AssertLastAssignedPartitionId requirement (5 );
378+
379+ auto status = requirement.Validate (nullptr );
380+ EXPECT_THAT (status, IsError (ErrorKind::kCommitFailed ));
381+ EXPECT_THAT (status, HasErrorMessage (" metadata is missing" ));
382+ }
383+
384+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertDefaultSpecIDSuccess) {
385+ base_metadata_->default_spec_id = 3 ;
386+ table::AssertDefaultSpecID requirement (3 );
387+
388+ ASSERT_THAT (requirement.Validate (base_metadata_.get ()), IsOk ());
389+ }
390+
391+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertDefaultSpecIDMismatch) {
392+ base_metadata_->default_spec_id = 3 ;
393+ table::AssertDefaultSpecID requirement (7 );
394+
395+ auto status = requirement.Validate (base_metadata_.get ());
396+ EXPECT_THAT (status, IsError (ErrorKind::kCommitFailed ));
397+ EXPECT_THAT (status, HasErrorMessage (" spec changed" ));
398+ }
399+
400+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertDefaultSortOrderIDSuccess) {
401+ base_metadata_->default_sort_order_id = 2 ;
402+ table::AssertDefaultSortOrderID requirement (2 );
403+
404+ ASSERT_THAT (requirement.Validate (base_metadata_.get ()), IsOk ());
405+ }
406+
407+ TEST_F (TableMetadataBuilderTest, TableRequirementAssertDefaultSortOrderIDMismatch) {
408+ base_metadata_->default_sort_order_id = 2 ;
409+ table::AssertDefaultSortOrderID requirement (4 );
410+
411+ auto status = requirement.Validate (base_metadata_.get ());
412+ EXPECT_THAT (status, IsError (ErrorKind::kCommitFailed ));
413+ EXPECT_THAT (status, HasErrorMessage (" sort order changed" ));
414+ }
415+
267416// ============================================================================
268417// Integration Tests - End-to-End Workflow
269418// ============================================================================
0 commit comments