View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.ddl.impl;
19  
20  import lombok.AccessLevel;
21  import lombok.NoArgsConstructor;
22  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.ColumnDefinitionSegment;
23  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.AddColumnDefinitionSegment;
24  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ChangeColumnDefinitionSegment;
25  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.DropColumnDefinitionSegment;
26  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
27  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyCollectionRetrievalSegment;
28  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.RenameColumnSegment;
29  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.AddConstraintDefinitionSegment;
30  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.ModifyConstraintDefinitionSegment;
31  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.RenameIndexDefinitionSegment;
32  import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.ConvertTableDefinitionSegment;
33  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
34  import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
35  import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterTableStatement;
36  import org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.AlterTableStatementHandler;
37  import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
38  import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.SQLSegmentAssert;
39  import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.charset.CharsetAssert;
40  import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.column.ColumnAssert;
41  import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ColumnDefinitionAssert;
42  import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ColumnPositionAssert;
43  import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ConstraintDefinitionAssert;
44  import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.IndexDefinitionAssert;
45  import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.expression.ExpressionAssert;
46  import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert;
47  import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedAddColumnDefinition;
48  import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedChangeColumnDefinition;
49  import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedColumnDefinition;
50  import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedConstraintDefinition;
51  import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedModifyColumnDefinition;
52  import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenameIndexDefinition;
53  import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenameColumnDefinition;
54  import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.AlterTableStatementTestCase;
55  
56  import java.util.Collection;
57  import java.util.LinkedList;
58  import java.util.List;
59  import java.util.Optional;
60  
61  import static org.hamcrest.CoreMatchers.is;
62  import static org.hamcrest.MatcherAssert.assertThat;
63  import static org.junit.jupiter.api.Assertions.assertFalse;
64  import static org.junit.jupiter.api.Assertions.assertNotNull;
65  import static org.junit.jupiter.api.Assertions.assertNull;
66  import static org.junit.jupiter.api.Assertions.assertTrue;
67  
68  /**
69   * Alter table statement assert.
70   */
71  @NoArgsConstructor(access = AccessLevel.PRIVATE)
72  public final class AlterTableStatementAssert {
73      
74      /**
75       * Assert alter table statement is correct with expected parser result.
76       * 
77       * @param assertContext assert context
78       * @param actual actual alter table statement
79       * @param expected expected alter table statement test case
80       */
81      public static void assertIs(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
82          assertTable(assertContext, actual, expected);
83          assertRenameTable(assertContext, actual, expected);
84          assertAddColumnDefinitions(assertContext, actual, expected);
85          assertAddConstraintDefinitions(assertContext, actual, expected);
86          assertModifyConstraintDefinitions(assertContext, actual, expected);
87          assertModifyColumnDefinitions(assertContext, actual, expected);
88          assertChangeColumnDefinitions(assertContext, actual, expected);
89          assertDropColumns(assertContext, actual, expected);
90          assertRenameIndexDefinitions(assertContext, actual, expected);
91          assertRenameColumnDefinitions(assertContext, actual, expected);
92          assertConvertTable(assertContext, actual, expected);
93          assertModifyCollectionRetrievalDefinitions(assertContext, actual, expected);
94      }
95      
96      private static void assertConvertTable(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
97          Optional<ConvertTableDefinitionSegment> convertTable = actual.getConvertTableDefinition();
98          if (null == expected.getConvertTable()) {
99              assertFalse(convertTable.isPresent(), assertContext.getText("Actual convert table segment should not exist."));
100         } else {
101             assertTrue(convertTable.isPresent(), assertContext.getText("Actual convert table segment should exist."));
102             CharsetAssert.assertIs(assertContext, convertTable.get().getCharsetName(), expected.getConvertTable().getCharsetName());
103             if (null == expected.getConvertTable().getCollateExpression()) {
104                 assertNull(convertTable.get().getCollateValue(), assertContext.getText("Actual collate expression should not exist."));
105             } else {
106                 ExpressionAssert.assertExpression(assertContext, convertTable.get().getCollateValue(), expected.getConvertTable().getCollateExpression().getCollateName());
107             }
108             SQLSegmentAssert.assertIs(assertContext, convertTable.get(), expected.getConvertTable());
109         }
110     }
111     
112     private static void assertRenameTable(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
113         Optional<SimpleTableSegment> tableSegment = actual.getRenameTable();
114         if (null == expected.getRenameTable()) {
115             assertFalse(tableSegment.isPresent(), assertContext.getText("Actual table segment should not exist."));
116         } else {
117             assertTrue(tableSegment.isPresent(), assertContext.getText("Actual table segment should exist."));
118             TableAssert.assertIs(assertContext, tableSegment.get(), expected.getRenameTable());
119         }
120     }
121     
122     private static void assertTable(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
123         TableAssert.assertIs(assertContext, actual.getTable(), expected.getTable());
124     }
125     
126     private static void assertAddColumnDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
127         assertThat(assertContext.getText("Add column definitions size assertion error: "), actual.getAddColumnDefinitions().size(), is(expected.getAddColumns().size()));
128         int count = 0;
129         for (AddColumnDefinitionSegment each : actual.getAddColumnDefinitions()) {
130             ExpectedAddColumnDefinition expectedAddColumnDefinition = expected.getAddColumns().get(count);
131             assertColumnDefinitions(assertContext, each.getColumnDefinitions(), expectedAddColumnDefinition.getColumnDefinitions());
132             if (each.getColumnPosition().isPresent()) {
133                 assertNotNull(expectedAddColumnDefinition.getColumnPosition(), assertContext.getText("Column position should exist."));
134                 ColumnPositionAssert.assertIs(assertContext, each.getColumnPosition().get(), expectedAddColumnDefinition.getColumnPosition());
135             } else {
136                 assertNull(expectedAddColumnDefinition.getColumnPosition(), assertContext.getText("Column position should not exist."));
137             }
138             count++;
139         }
140     }
141     
142     private static void assertColumnDefinitions(final SQLCaseAssertContext assertContext, final Collection<ColumnDefinitionSegment> actual, final List<ExpectedColumnDefinition> expected) {
143         int count = 0;
144         for (ColumnDefinitionSegment each : actual) {
145             ColumnDefinitionAssert.assertIs(assertContext, each, expected.get(count));
146             count++;
147         }
148     }
149     
150     private static void assertAddConstraintDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
151         int count = 0;
152         for (AddConstraintDefinitionSegment each : actual.getAddConstraintDefinitions()) {
153             ConstraintDefinitionAssert.assertIs(assertContext, each.getConstraintDefinition(), expected.getAddConstraints().get(count));
154             count++;
155         }
156     }
157     
158     private static void assertModifyConstraintDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
159         assertThat(assertContext.getText("Modify constraint definitions size assertion error: "), actual.getModifyConstraintDefinitions().size(), is(expected.getModifyConstraints().size()));
160         int count = 0;
161         for (ModifyConstraintDefinitionSegment each : actual.getModifyConstraintDefinitions()) {
162             ExpectedConstraintDefinition expectedConstraintDefinition = expected.getModifyConstraints().get(count);
163             if (null == expectedConstraintDefinition.getConstraintName()) {
164                 assertNull(each.getConstraintName(), "Actual modify constraint name should not exist.");
165             } else {
166                 assertNotNull(each.getConstraintName(), "Actual modify constraint name should exist.");
167                 assertThat(assertContext.getText("Actual modify constraint name assertion error."),
168                         each.getConstraintName().getIdentifier().getValue(), is(expectedConstraintDefinition.getConstraintName()));
169             }
170             count++;
171         }
172     }
173     
174     private static void assertModifyColumnDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
175         assertThat(assertContext.getText("Modify column definitions size assertion error: "), actual.getModifyColumnDefinitions().size(), is(expected.getModifyColumns().size()));
176         int count = 0;
177         for (ModifyColumnDefinitionSegment each : actual.getModifyColumnDefinitions()) {
178             ExpectedModifyColumnDefinition expectedModifyColumnDefinition = expected.getModifyColumns().get(count);
179             ColumnDefinitionAssert.assertIs(assertContext, each.getColumnDefinition(), expectedModifyColumnDefinition.getColumnDefinition());
180             if (each.getColumnPosition().isPresent()) {
181                 assertNotNull(expectedModifyColumnDefinition.getColumnPosition(), assertContext.getText("Column position should exist."));
182                 ColumnPositionAssert.assertIs(assertContext, each.getColumnPosition().get(), expectedModifyColumnDefinition.getColumnPosition());
183             } else {
184                 assertNull(expectedModifyColumnDefinition.getColumnPosition(), assertContext.getText("Column position should not exist."));
185             }
186             count++;
187         }
188     }
189     
190     private static void assertChangeColumnDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
191         assertThat(assertContext.getText("Change column definitions size assertion error: "), actual.getChangeColumnDefinitions().size(), is(expected.getChangeColumns().size()));
192         int count = 0;
193         for (ChangeColumnDefinitionSegment each : actual.getChangeColumnDefinitions()) {
194             ExpectedChangeColumnDefinition expectedChangeColumnDefinition = expected.getChangeColumns().get(count);
195             ColumnDefinitionAssert.assertIs(assertContext, each.getColumnDefinition(), expectedChangeColumnDefinition.getColumnDefinition());
196             if (each.getColumnPosition().isPresent()) {
197                 assertNotNull(expectedChangeColumnDefinition.getColumnPosition(), assertContext.getText("Column position should exist."));
198                 ColumnPositionAssert.assertIs(assertContext, each.getColumnPosition().get(), expectedChangeColumnDefinition.getColumnPosition());
199             } else {
200                 assertNull(expectedChangeColumnDefinition.getColumnPosition(), assertContext.getText("Column position should not exist."));
201             }
202             if (null != each.getPreviousColumn()) {
203                 ColumnAssert.assertIs(assertContext, each.getPreviousColumn(), expectedChangeColumnDefinition.getPreviousColumn());
204             }
205             count++;
206         }
207     }
208     
209     private static void assertDropColumns(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
210         Collection<ColumnSegment> actualDropColumns = getDropColumns(actual);
211         assertThat(assertContext.getText("Drop columns size assertion error: "), actualDropColumns.size(), is(expected.getDropColumns().size()));
212         int count = 0;
213         for (ColumnSegment each : actualDropColumns) {
214             ColumnAssert.assertIs(assertContext, each, expected.getDropColumns().get(count));
215             count++;
216         }
217     }
218     
219     private static Collection<ColumnSegment> getDropColumns(final AlterTableStatement actual) {
220         Collection<ColumnSegment> result = new LinkedList<>();
221         for (DropColumnDefinitionSegment each : actual.getDropColumnDefinitions()) {
222             result.addAll(each.getColumns());
223         }
224         return result;
225     }
226     
227     private static void assertRenameIndexDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
228         assertThat(assertContext.getText("Rename index definitions size assertion error: "), actual.getRenameIndexDefinitions().size(), is(expected.getRenameIndexes().size()));
229         int count = 0;
230         for (RenameIndexDefinitionSegment each : actual.getRenameIndexDefinitions()) {
231             ExpectedRenameIndexDefinition expectedRenameIndexDefinition = expected.getRenameIndexes().get(count);
232             IndexDefinitionAssert.assertIs(assertContext, each.getIndexSegment(), expectedRenameIndexDefinition.getIndexDefinition());
233             IndexDefinitionAssert.assertIs(assertContext, each.getRenameIndexSegment(), expectedRenameIndexDefinition.getRenameIndexDefinition());
234             count++;
235         }
236     }
237     
238     private static void assertRenameColumnDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
239         assertThat(assertContext.getText("Rename columns definitions size assertion error:"), actual.getRenameColumnDefinitions().size(), is(expected.getRenameColumns().size()));
240         int count = 0;
241         for (RenameColumnSegment each : actual.getRenameColumnDefinitions()) {
242             ExpectedRenameColumnDefinition expectedRenameColumnDefinition = expected.getRenameColumns().get(count);
243             ColumnAssert.assertIs(assertContext, each.getOldColumnName(), expectedRenameColumnDefinition.getOldColumnName());
244             ColumnAssert.assertIs(assertContext, each.getColumnName(), expectedRenameColumnDefinition.getColumnName());
245             count++;
246         }
247     }
248     
249     private static void assertModifyCollectionRetrievalDefinitions(final SQLCaseAssertContext assertContext, final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
250         Optional<ModifyCollectionRetrievalSegment> modifyCollectionRetrieval = AlterTableStatementHandler.getModifyCollectionRetrievalSegment(actual);
251         if (null == expected.getModifyCollectionRetrievalDefinition()) {
252             assertFalse(modifyCollectionRetrieval.isPresent(), assertContext.getText("Actual modify collection retrieval definitions should not exist."));
253         } else {
254             assertTrue(modifyCollectionRetrieval.isPresent(), assertContext.getText("Actual modify collection retrieval definitions should exist."));
255             if (null == expected.getModifyCollectionRetrievalDefinition().getTable()) {
256                 assertNull(modifyCollectionRetrieval.get().getNestedTable(), "Actual nested table should not exist.");
257             } else {
258                 assertNotNull(modifyCollectionRetrieval.get().getNestedTable(), "Actual nested table should exist.");
259                 TableAssert.assertIs(assertContext, modifyCollectionRetrieval.get().getNestedTable(), expected.getModifyCollectionRetrievalDefinition().getTable());
260             }
261         }
262     }
263 }