['ID', 'Accountid', 'Last', 'Email', 'FENContact1'], 'accounts' => ['ID', 'Name', 'Type'], ]); $parser = new DslParser(); $validator = new DslValidator($metadata); $ast = $parser->parse('contacts and accounts where contacts.Accountid = accounts.ID'); $validation = $validator->validate($ast); if ($validation['errors'] !== []) { fwrite(STDERR, 'Expected no validation errors, got: ' . json_encode($validation['errors']) . "\n"); exit(1); } $expected = [ 'contacts.ID', 'contacts.Accountid', 'contacts.Last', 'contacts.Email', 'contacts.FENContact1', 'accounts.ID', 'accounts.Name', 'accounts.Type', ]; sort($expected); $actual = $validation['expected_fields']; sort($actual); if ($actual !== $expected) { fwrite(STDERR, 'Expected-field contract mismatch\n'); fwrite(STDERR, 'Expected: ' . json_encode($expected) . "\n"); fwrite(STDERR, 'Actual: ' . json_encode($actual) . "\n"); exit(1); } echo "Preview shape contract test passed\n";