Skip to content

Commit a65f518

Browse files
committedSep 28, 2017
Use self.assertTrue instead of assert
1 parent 2bbc5a5 commit a65f518

File tree

1 file changed

+45
-39
lines changed

1 file changed

+45
-39
lines changed
 

‎tests/src/python/test_provider_wfs.py

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def setUpClass(cls):
132132

133133
# Create test layer
134134
cls.vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename'", 'test', 'WFS')
135-
assert (cls.vl.isValid())
135+
assert cls.vl.isValid()
136136
cls.source = cls.vl.dataProvider()
137137

138138
with open(sanitize(endpoint, '?SERVICE=WFS&REQUEST=GetFeature&VERSION=2.0.0&TYPENAMES=my:typename&SRSNAME=urn:ogc:def:crs:EPSG::4326'), 'wb') as f:
@@ -362,7 +362,7 @@ def testInconsistentUri(self):
362362

363363
# Could not find typename my:typename in capabilities
364364
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename'", 'test', 'WFS')
365-
assert not vl.isValid()
365+
self.assertFalse(vl.isValid())
366366

367367
def testWFS10(self):
368368
"""Test WFS 1.0 read-only"""
@@ -409,7 +409,7 @@ def testWFS10(self):
409409
""".encode('UTF-8'))
410410

411411
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='1.0.0'", 'test', 'WFS')
412-
assert vl.isValid()
412+
self.assertTrue(vl.isValid())
413413
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
414414
self.assertEqual(len(vl.fields()), 5)
415415
self.assertEqual(vl.featureCount(), 0)
@@ -467,9 +467,9 @@ def testWFS10(self):
467467
self.assertEqual(vl.dataProvider().capabilities(), QgsVectorDataProvider.SelectAtId)
468468

469469
(ret, _) = vl.dataProvider().addFeatures([QgsFeature()])
470-
assert not ret
470+
self.assertFalse(ret)
471471

472-
assert not vl.dataProvider().deleteFeatures([0])
472+
self.assertFalse(vl.dataProvider().deleteFeatures([0]))
473473

474474
# Test with restrictToRequestBBOX=1
475475
with open(sanitize(endpoint, '?SERVICE=WFS&REQUEST=GetFeature&VERSION=1.0.0&TYPENAME=my:typename&SRSNAME=EPSG:32631&BBOX=400000,5400000,450000,5500000'), 'wb') as f:
@@ -545,7 +545,7 @@ def testWFS10_outputformat_GML3(self):
545545
""".encode('UTF-8'))
546546

547547
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='1.0.0'", 'test', 'WFS')
548-
assert vl.isValid()
548+
self.assertTrue(vl.isValid())
549549

550550
with open(sanitize(endpoint, '?SERVICE=WFS&REQUEST=GetFeature&VERSION=1.0.0&TYPENAME=my:typename&SRSNAME=EPSG:32631&OUTPUTFORMAT=GML3'), 'wb') as f:
551551
f.write("""
@@ -569,7 +569,7 @@ def testWFS10_outputformat_GML3(self):
569569

570570
# Test with explicit OUTPUTFORMAT as parameter
571571
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='1.0.0' outputformat='GML2'", 'test', 'WFS')
572-
assert vl.isValid()
572+
self.assertTrue(vl.isValid())
573573

574574
with open(sanitize(endpoint, '?SERVICE=WFS&REQUEST=GetFeature&VERSION=1.0.0&TYPENAME=my:typename&SRSNAME=EPSG:32631&OUTPUTFORMAT=GML2'), 'wb') as f:
575575
f.write("""
@@ -593,7 +593,7 @@ def testWFS10_outputformat_GML3(self):
593593

594594
# Test with explicit OUTPUTFORMAT in URL
595595
vl = QgsVectorLayer("url='http://" + endpoint + "?OUTPUTFORMAT=GML2' typename='my:typename' version='1.0.0'", 'test', 'WFS')
596-
assert vl.isValid()
596+
self.assertTrue(vl.isValid())
597597

598598
with open(sanitize(endpoint, '?SERVICE=WFS&REQUEST=GetFeature&VERSION=1.0.0&TYPENAME=my:typename&SRSNAME=EPSG:32631&OUTPUTFORMAT=GML2'), 'wb') as f:
599599
f.write("""
@@ -654,7 +654,7 @@ def testWFS10_latlongboundingbox_in_WGS84(self):
654654
""".encode('UTF-8'))
655655

656656
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='1.0.0'", 'test', 'WFS')
657-
assert vl.isValid()
657+
self.assertTrue(vl.isValid())
658658

659659
reference = QgsGeometry.fromRect(QgsRectangle(399999.9999999680439942, 5399338.9090830031782389, 449999.9999999987776391, 5500658.0448500607162714))
660660
vl_extent = QgsGeometry.fromRect(vl.extent())
@@ -707,7 +707,7 @@ def testWFST10(self):
707707
""".encode('UTF-8'))
708708

709709
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='1.0.0'", 'test', 'WFS')
710-
assert vl.isValid()
710+
self.assertTrue(vl.isValid())
711711

712712
self.assertEqual(vl.dataProvider().capabilities(),
713713
QgsVectorDataProvider.AddFeatures |
@@ -717,17 +717,17 @@ def testWFST10(self):
717717
QgsVectorDataProvider.SelectAtId)
718718

719719
(ret, _) = vl.dataProvider().addFeatures([QgsFeature()])
720-
assert not ret
720+
self.assertFalse(ret)
721721

722722
self.assertEqual(vl.featureCount(), 0)
723723

724-
assert not vl.dataProvider().deleteFeatures([0])
724+
self.assertFalse(vl.dataProvider().deleteFeatures([0]))
725725

726726
self.assertEqual(vl.featureCount(), 0)
727727

728-
assert not vl.dataProvider().changeGeometryValues({0: QgsGeometry.fromWkt('Point (3 50)')})
728+
self.assertFalse(vl.dataProvider().changeGeometryValues({0: QgsGeometry.fromWkt('Point (3 50)')}))
729729

730-
assert not vl.dataProvider().changeAttributeValues({0: {0: 0}})
730+
self.assertFalse(vl.dataProvider().changeAttributeValues({0: {0: 0}}))
731731

732732
# Test addFeatures
733733
response = """
@@ -753,8 +753,15 @@ def testWFST10(self):
753753
f = QgsFeature()
754754
f.setAttributes([1, 1234567890123, 'foo', QDateTime(2016, 4, 10, 12, 34, 56, 789, Qt.TimeSpec(Qt.UTC))])
755755
f.setGeometry(QgsGeometry.fromWkt('Point (2 49)'))
756+
757+
def logMessage(self, msg, tag, level):
758+
print('--------################----------------')
759+
print(msg)
760+
print('--------################----------------')
761+
762+
QgsApplication.messageLog().messageReceived.connect(logMessage)
756763
(ret, fl) = vl.dataProvider().addFeatures([f])
757-
assert ret
764+
self.assertTrue(ret)
758765
self.assertEqual(fl[0].id(), 1)
759766

760767
self.assertEqual(vl.featureCount(), 1)
@@ -793,8 +800,7 @@ def testWFST10(self):
793800
with open(sanitize(endpoint, '?SERVICE=WFS&POSTDATA=<Transaction xmlns="http://www.opengis.net/wfs" service="WFS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://my http://fake_qgis_http_endpoint?REQUEST=DescribeFeatureType&amp;VERSION=1.0.0&amp;TYPENAME=my:typename" xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml" version="1.0.0"><Update xmlns="http://www.opengis.net/wfs" typeName="my:typename"><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">geometryProperty</Name><Value xmlns="http://www.opengis.net/wfs"><gml:Point srsName="EPSG:4326"><gml:coordinates cs="," ts=" ">3,50</gml:coordinates></gml:Point></Value></Property><Filter xmlns="http://www.opengis.net/ogc"><FeatureId xmlns="http://www.opengis.net/ogc" fid="typename.1"/></Filter></Update></Transaction>'), 'wb') as f:
794801
f.write(content.encode('UTF-8'))
795802

796-
ret = vl.dataProvider().changeGeometryValues({1: QgsGeometry.fromWkt('Point (3 50)')})
797-
assert ret
803+
self.assertTrue(vl.dataProvider().changeGeometryValues({1: QgsGeometry.fromWkt('Point (3 50)')}))
798804

799805
got_f = [f for f in vl.getFeatures()]
800806
got = got_f[0].geometry().geometry()
@@ -829,7 +835,7 @@ def testWFST10(self):
829835
with open(sanitize(endpoint, '?SERVICE=WFS&POSTDATA=<Transaction xmlns="http://www.opengis.net/wfs" service="WFS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://my http://fake_qgis_http_endpoint?REQUEST=DescribeFeatureType&amp;VERSION=1.0.0&amp;TYPENAME=my:typename" xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml" version="1.0.0"><Update xmlns="http://www.opengis.net/wfs" typeName="my:typename"><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">intfield</Name><Value xmlns="http://www.opengis.net/wfs">2</Value></Property><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">longfield</Name><Value xmlns="http://www.opengis.net/wfs">3</Value></Property><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">stringfield</Name><Value xmlns="http://www.opengis.net/wfs">bar</Value></Property><Property xmlns="http://www.opengis.net/wfs"><Name xmlns="http://www.opengis.net/wfs">datetimefield</Name><Value xmlns="http://www.opengis.net/wfs">2015-04-10T12:34:56.789Z</Value></Property><Filter xmlns="http://www.opengis.net/ogc"><FeatureId xmlns="http://www.opengis.net/ogc" fid="typename.1"/></Filter></Update></Transaction>'), 'wb') as f:
830836
f.write(content.encode('UTF-8'))
831837

832-
assert vl.dataProvider().changeAttributeValues({1: {0: 2, 1: 3, 2: "bar", 3: QDateTime(2015, 4, 10, 12, 34, 56, 789, Qt.TimeSpec(Qt.UTC))}})
838+
self.assertTrue(vl.dataProvider().changeAttributeValues({1: {0: 2, 1: 3, 2: "bar", 3: QDateTime(2015, 4, 10, 12, 34, 56, 789, Qt.TimeSpec(Qt.UTC))}}))
833839

834840
values = [f['intfield'] for f in vl.getFeatures()]
835841
self.assertEqual(values, [2])
@@ -864,7 +870,7 @@ def testWFST10(self):
864870
with open(sanitize(endpoint, '?SERVICE=WFS&POSTDATA=<Transaction xmlns="http://www.opengis.net/wfs" service="WFS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://my http://fake_qgis_http_endpoint?REQUEST=DescribeFeatureType&amp;VERSION=1.0.0&amp;TYPENAME=my:typename" xmlns:my="http://my" xmlns:gml="http://www.opengis.net/gml" version="1.0.0"><Delete xmlns="http://www.opengis.net/wfs" typeName="my:typename"><Filter xmlns="http://www.opengis.net/ogc"><FeatureId xmlns="http://www.opengis.net/ogc" fid="typename.1"/></Filter></Delete></Transaction>'), 'wb') as f:
865871
f.write(content.encode('UTF-8'))
866872

867-
assert vl.dataProvider().deleteFeatures([1])
873+
self.assertTrue(vl.dataProvider().deleteFeatures([1]))
868874

869875
self.assertEqual(vl.featureCount(), 0)
870876

@@ -936,7 +942,7 @@ def testWFS20Paging(self):
936942

937943
# Create test layer
938944
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename'", 'test', 'WFS')
939-
assert vl.isValid()
945+
self.assertTrue(vl.isValid())
940946
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
941947

942948
with open(sanitize(endpoint, '?SERVICE=WFS&REQUEST=GetFeature&VERSION=2.0.0&TYPENAMES=my:typename&STARTINDEX=1&COUNT=1&SRSNAME=urn:ogc:def:crs:EPSG::4326'), 'wb') as f:
@@ -1046,7 +1052,7 @@ def testWFSGetOnlyFeaturesInViewExtent(self):
10461052

10471053
# Create test layer
10481054
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' restrictToRequestBBOX=1", 'test', 'WFS')
1049-
assert vl.isValid()
1055+
self.assertTrue(vl.isValid())
10501056
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
10511057

10521058
last_url = sanitize(endpoint, '?SERVICE=WFS&REQUEST=GetFeature&VERSION=1.1.0&TYPENAME=my:typename&MAXFEATURES=2&SRSNAME=urn:ogc:def:crs:EPSG::4326&BBOX=60,-70,80,-60,urn:ogc:def:crs:EPSG::4326')
@@ -1232,7 +1238,7 @@ def testWFS20TruncatedResponse(self):
12321238

12331239
# Create test layer
12341240
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename'", 'test', 'WFS')
1235-
assert vl.isValid()
1241+
self.assertTrue(vl.isValid())
12361242

12371243
# Check that we get a log message
12381244
with MessageLogger('WFS') as logger:
@@ -1276,7 +1282,7 @@ def testRetryLogic(self):
12761282
""".encode('UTF-8'))
12771283

12781284
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='1.0.0'", 'test', 'WFS')
1279-
assert vl.isValid()
1285+
self.assertTrue(vl.isValid())
12801286
self.assertEqual(vl.wkbType(), QgsWkbTypes.NoGeometry)
12811287
self.assertEqual(len(vl.fields()), 1)
12821288

@@ -1366,7 +1372,7 @@ def testDetachedFeatureSource(self):
13661372
""".encode('UTF-8'))
13671373

13681374
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='1.0.0'", 'test', 'WFS')
1369-
assert vl.isValid()
1375+
self.assertTrue(vl.isValid())
13701376
self.assertEqual(vl.wkbType(), QgsWkbTypes.NoGeometry)
13711377
self.assertEqual(len(vl.fields()), 1)
13721378

@@ -1520,7 +1526,7 @@ def testJoins(self):
15201526

15211527
# * syntax
15221528
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='2.0.0' sql=SELECT * FROM \"my:typename\" JOIN \"my:othertypename\" o ON \"my:typename\".id = o.main_id WHERE \"my:typename\".id > 0 ORDER BY \"my:typename\".id DESC", 'test', 'WFS')
1523-
assert vl.isValid()
1529+
self.assertTrue(vl.isValid())
15241530
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
15251531
fields = vl.fields()
15261532
self.assertEqual(len(fields), 3, fields)
@@ -1533,7 +1539,7 @@ def testJoins(self):
15331539

15341540
# * syntax with unprefixed typenames
15351541
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='2.0.0' sql=SELECT * FROM typename JOIN othertypename o ON typename.id = o.main_id WHERE typename.id > 0 ORDER BY typename.id DESC", 'test', 'WFS')
1536-
assert vl.isValid()
1542+
self.assertTrue(vl.isValid())
15371543
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
15381544
fields = vl.fields()
15391545
self.assertEqual(len(fields), 3, fields)
@@ -1550,7 +1556,7 @@ def testJoins(self):
15501556
f.write(schema.encode('UTF-8'))
15511557

15521558
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='2.0.0' sql=SELECT * FROM othertypename o, typename WHERE typename.id = o.main_id AND typename.id > 0 ORDER BY typename.id DESC", 'test', 'WFS')
1553-
assert vl.isValid()
1559+
self.assertTrue(vl.isValid())
15541560
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
15551561
fields = vl.fields()
15561562
self.assertEqual(len(fields), 3, fields)
@@ -1560,7 +1566,7 @@ def testJoins(self):
15601566

15611567
# main table not appearing in first, not in FROM but in JOIN
15621568
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='2.0.0' sql=SELECT * FROM othertypename o JOIN typename ON typename.id = o.main_id WHERE typename.id > 0 ORDER BY typename.id DESC", 'test', 'WFS')
1563-
assert vl.isValid()
1569+
self.assertTrue(vl.isValid())
15641570
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
15651571
fields = vl.fields()
15661572
self.assertEqual(len(fields), 3, fields)
@@ -1942,7 +1948,7 @@ def testSelectDistinct(self):
19421948
</wfs:FeatureCollection>""".encode('UTF-8'))
19431949

19441950
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='2.0.0' sql=SELECT DISTINCT * FROM \"my:typename\"", 'test', 'WFS')
1945-
assert vl.isValid()
1951+
self.assertTrue(vl.isValid())
19461952

19471953
values = [(f['intfield'], f['longfield'], f['stringfield'], f['datetimefield']) for f in vl.getFeatures()]
19481954
self.assertEqual(values, [(1, 1234567890, 'foo', QDateTime(2016, 4, 10, 12, 34, 56, 789, Qt.TimeSpec(Qt.UTC))),
@@ -1952,7 +1958,7 @@ def testSelectDistinct(self):
19521958
(1, 1234567890, 'foo', QDateTime(2016, 4, 10, 12, 34, 56, 788, Qt.TimeSpec(Qt.UTC)))])
19531959

19541960
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='2.0.0' sql=SELECT DISTINCT intfield FROM \"my:typename\"", 'test', 'WFS')
1955-
assert vl.isValid()
1961+
self.assertTrue(vl.isValid())
19561962

19571963
values = [(f['intfield']) for f in vl.getFeatures()]
19581964
self.assertEqual(values, [(1), (2)])
@@ -2015,7 +2021,7 @@ def testWrongCapabilityExtent(self):
20152021
</wfs:FeatureCollection>""".encode('UTF-8'))
20162022

20172023
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='2.0.0'", 'test', 'WFS')
2018-
assert vl.isValid()
2024+
self.assertTrue(vl.isValid())
20192025

20202026
# Download all features
20212027
features = [f for f in vl.getFeatures()]
@@ -2027,7 +2033,7 @@ def testWrongCapabilityExtent(self):
20272033

20282034
# Same with restrictToRequestBBOX=1
20292035
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='2.0.0' restrictToRequestBBOX=1", 'test', 'WFS')
2030-
assert vl.isValid()
2036+
self.assertTrue(vl.isValid())
20312037

20322038
# First request that will be attempted
20332039
with open(sanitize(endpoint, """?SERVICE=WFS&REQUEST=GetFeature&VERSION=2.0.0&TYPENAMES=my:typename&SRSNAME=urn:ogc:def:crs:EPSG::4326&BBOX=-0.125,-0.125,1.125,1.125,urn:ogc:def:crs:EPSG::4326"""), 'wb') as f:
@@ -2060,7 +2066,7 @@ def testWrongCapabilityExtent(self):
20602066
self.assertEqual(len(features), 0)
20612067

20622068
# Check that the approx extent contains the geometry
2063-
assert vl.extent().contains(QgsPointXY(2, 49))
2069+
self.assertTrue(vl.extent().contains(QgsPointXY(2, 49)))
20642070

20652071
def testGeomedia(self):
20662072
"""Test various interoperability specifities that occur with Geomedia Web Server."""
@@ -2158,7 +2164,7 @@ def testGeomedia(self):
21582164
QgsSettings().setValue('wfs/max_feature_count_if_not_provided', '1')
21592165

21602166
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='2.0.0'", 'test', 'WFS')
2161-
assert vl.isValid()
2167+
self.assertTrue(vl.isValid())
21622168
self.assertEqual(vl.wkbType(), QgsWkbTypes.MultiPolygon)
21632169

21642170
# Extent before downloading features
@@ -2258,7 +2264,7 @@ def testMapServerWFS1_1_EPSG_4326(self):
22582264
""".encode('UTF-8'))
22592265

22602266
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='1.1.0'", 'test', 'WFS')
2261-
assert vl.isValid()
2267+
self.assertTrue(vl.isValid())
22622268

22632269
got_f = [f for f in vl.getFeatures()]
22642270
got = got_f[0].geometry().geometry()
@@ -2346,7 +2352,7 @@ def testDescribeFeatureTypeWithInlineType(self):
23462352
""".encode('UTF-8'))
23472353

23482354
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='1.1.0'", 'test', 'WFS')
2349-
assert vl.isValid()
2355+
self.assertTrue(vl.isValid())
23502356

23512357
got_f = [f for f in vl.getFeatures()]
23522358
got = got_f[0].geometry().geometry()
@@ -2405,7 +2411,7 @@ def testWFS20TransactionsDisabled(self):
24052411

24062412
# Create test layer
24072413
vl = QgsVectorLayer(u"url='http://" + endpoint + u"' typename='my:typename'", u'test', u'WFS')
2408-
assert vl.isValid()
2414+
self.assertTrue(vl.isValid())
24092415
self.assertEqual(vl.dataProvider().capabilities() & vl.dataProvider().EditingCapabilities, vl.dataProvider().NoCapabilities)
24102416
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
24112417

@@ -2485,7 +2491,7 @@ def testWFS20TransactionsEnabled(self):
24852491

24862492
# Create test layer
24872493
vl = QgsVectorLayer(u"url='http://" + endpoint + u"' typename='my:typename'", u'test', u'WFS')
2488-
assert vl.isValid()
2494+
self.assertTrue(vl.isValid())
24892495
self.assertNotEqual(vl.dataProvider().capabilities() & vl.dataProvider().EditingCapabilities, vl.dataProvider().NoCapabilities)
24902496
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
24912497

@@ -2528,7 +2534,7 @@ def testDeprecatedGML2GeometryDeclaration(self):
25282534
""".encode('UTF-8'))
25292535

25302536
vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename' version='1.0.0'", 'test', 'WFS')
2531-
assert vl.isValid()
2537+
self.assertTrue(vl.isValid())
25322538
self.assertEqual(vl.wkbType(), QgsWkbTypes.Point)
25332539
self.assertEqual(len(vl.fields()), 1)
25342540

0 commit comments

Comments
 (0)
Please sign in to comment.