Author: kono
Date: 2010-08-17 17:04:40 -0700 (Tue, 17 Aug 2010)
New Revision: 21423
Added:
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/StringVisualProperty.java
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/CyNetworkViewTest.java
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/CyNodeViewTest.java
Modified:
core3/viewmodel-api/trunk/pom.xml
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/AbstractCyNetworkViewTest.java
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/AbstractViewTest.java
core3/viewmodel-impl/trunk/pom.xml
core3/viewmodel-impl/trunk/src/main/java/org/cytoscape/view/model/internal/ViewImpl.java
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/ITViewModelImpl.java
Log:
Unit tests added. for view model.
Modified: core3/viewmodel-api/trunk/pom.xml
===================================================================
--- core3/viewmodel-api/trunk/pom.xml 2010-08-17 23:42:46 UTC (rev 21422)
+++ core3/viewmodel-api/trunk/pom.xml 2010-08-18 00:04:40 UTC (rev 21423)
@@ -126,7 +126,7 @@
<!-- unit tests -->
<dependency>
<groupId>org.easymock</groupId>
- <artifactId>com.springsource.org.easymock</artifactId>
+ <artifactId>easymock</artifactId>
<version>${easymock.version}</version>
<scope>test</scope>
</dependency>
Modified:
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/AbstractCyNetworkViewTest.java
===================================================================
---
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/AbstractCyNetworkViewTest.java
2010-08-17 23:42:46 UTC (rev 21422)
+++
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/AbstractCyNetworkViewTest.java
2010-08-18 00:04:40 UTC (rev 21423)
@@ -1,11 +1,13 @@
package org.cytoscape.view.model;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
import org.cytoscape.model.CyEdge;
import org.cytoscape.model.CyNetwork;
import org.cytoscape.model.CyNode;
-import org.junit.After;
-import org.junit.Before;
import org.junit.Test;
public class AbstractCyNetworkViewTest {
@@ -13,49 +15,75 @@
private static final int NODE_COUNT = 5;
private static final int EDGE_COUNT = 8;
- private CyNetwork network;
- private CyNetworkView view;
- private CyNetworkViewFactory factory;
+ protected CyNetwork network;
+ protected CyNetworkView view;
-
- @Before
- public void setUp() throws Exception {
- buildNetwork();
- view = factory.getNetworkView(network);
+ protected CyNode node1, node2, node3, node4, node5;
+ protected CyEdge edge1, edge2, edge3, edge4, edge5, edge6, edge7,
edge8;
+
+
+ @Test
+ public void testNetworkViewOnlyMethods() throws Exception {
+ assertNotNull(view.getNodeViews());
+ assertEquals(NODE_COUNT, view.getNodeViews().size());
+ assertNotNull(view.getEdgeViews());
+ assertEquals(EDGE_COUNT, view.getEdgeViews().size());
+
+ assertNotNull(view.getAllViews());
+ assertEquals(NODE_COUNT+EDGE_COUNT+1,
view.getAllViews().size());
+
+ assertNotNull(view.getNodeView(node1));
+ assertNotNull(view.getNodeView(node2));
+ assertNotNull(view.getNodeView(node3));
+ assertNotNull(view.getNodeView(node4));
+ assertNotNull(view.getNodeView(node5));
+
+ assertNotNull(view.getEdgeView(edge1));
+ assertNotNull(view.getEdgeView(edge2));
+ assertNotNull(view.getEdgeView(edge3));
+ assertNotNull(view.getEdgeView(edge4));
+ assertNotNull(view.getEdgeView(edge5));
+ assertNotNull(view.getEdgeView(edge6));
+ assertNotNull(view.getEdgeView(edge7));
+ assertNotNull(view.getEdgeView(edge8));
}
-
- @After
- public void tearDown() throws Exception {
- }
-
@Test
- public void testNetworkView() throws Exception {
+ public void testGetModel() {
+ assertNotNull( view.getModel() );
+ boolean modelTypeTest = false;
+ if(view.getModel() instanceof CyNetwork)
+ modelTypeTest = true;
+
+ assertTrue(modelTypeTest);
+
}
/**
* Create a very small network for testing
*/
- private void buildNetwork() {
+ protected void buildNetwork() {
- CyNode node1 = network.addNode();
- CyNode node2 = network.addNode();
- CyNode node3 = network.addNode();
- CyNode node4 = network.addNode();
- CyNode node5 = network.addNode();
+ node1 = network.addNode();
+ node2 = network.addNode();
+ node3 = network.addNode();
+ node4 = network.addNode();
+ node5 = network.addNode();
- CyEdge edge1 = network.addEdge(node1, node2, true);
- CyEdge edge2 = network.addEdge(node1, node2, true);
- CyEdge edge3 = network.addEdge(node1, node2, true);
- CyEdge edge4 = network.addEdge(node1, node2, true);
- CyEdge edge5 = network.addEdge(node1, node2, true);
- CyEdge edge6 = network.addEdge(node1, node2, true);
- CyEdge edge7 = network.addEdge(node1, node2, true);
- CyEdge edge8 = network.addEdge(node1, node2, true);
+ edge1 = network.addEdge(node1, node2, true);
+ edge2 = network.addEdge(node2, node2, true);
+ edge3 = network.addEdge(node3, node4, true);
+ edge4 = network.addEdge(node1, node5, true);
+ edge5 = network.addEdge(node5, node4, true);
+ edge6 = network.addEdge(node3, node2, true);
+ edge7 = network.addEdge(node5, node1, true);
+ edge8 = network.addEdge(node4, node3, true);
}
+
+
}
Modified:
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/AbstractViewTest.java
===================================================================
---
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/AbstractViewTest.java
2010-08-17 23:42:46 UTC (rev 21422)
+++
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/AbstractViewTest.java
2010-08-18 00:04:40 UTC (rev 21423)
@@ -1,65 +1,85 @@
package org.cytoscape.view.model;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
import org.junit.Test;
-import static org.junit.Assert.*;
-import static org.easymock.EasyMock.*;
public abstract class AbstractViewTest<S> {
- protected VisualProperty<Integer> intVP = new
IntegerVisualProperty("zero",Integer.valueOf(0),"intvp","INTVP");
+ protected VisualProperty<Integer> integerVP;
+ protected VisualProperty<String> stringVP;
+
protected View<S> view;
-
- @Test
- public void testGetSetVisualProperty() {
- view.setVisualProperty(intVP,1);
- assertEquals("intVP
value",1,view.getVisualProperty(intVP).intValue());
- view.setVisualProperty(intVP,5);
- assertEquals("intVP
value",5,view.getVisualProperty(intVP).intValue());
- view.setVisualProperty(intVP,-12345);
- assertEquals("intVP
value",-12345,view.getVisualProperty(intVP).intValue());
-
- // TODO improve unit test
+
+ @Before
+ public void setUp() throws Exception {
+ integerVP = new IntegerVisualProperty("GRAPH_OBJECT",
Integer.valueOf(0), "integerVP", "INTVP");
+ stringVP = new StringVisualProperty("GRAPH_OBJECT", "",
"stringVP", "STRVP");
}
+
@Test
- public void testSetLockedValue() {
- // TODO add unit test
+ public void testVisualPropertyGetterAndSetter() {
+ view.setVisualProperty(integerVP, 1);
+ assertEquals(Integer.valueOf(1),
view.getVisualProperty(integerVP));
+
+ view.setVisualProperty(integerVP, null);
+ assertNull(view.getVisualProperty(integerVP));
+
+ view.setVisualProperty(integerVP,-12345);
+ assertEquals(Integer.valueOf(-12345),
view.getVisualProperty(integerVP));
+
+ view.setVisualProperty(stringVP, "Test string.");
+ assertEquals("Test string.", view.getVisualProperty(stringVP));
+
+ view.setVisualProperty(stringVP, "");
+ assertEquals("", view.getVisualProperty(stringVP));
+
+ view.setVisualProperty(stringVP, null);
+ assertNull(view.getVisualProperty(stringVP));
+
}
@Test
- public void testIsValueLocked() {
- // TODO add unit test
+ public void testLock() {
+ final Integer unlocked = 123;
+ final Integer locked = 1000;
+
+ view.setVisualProperty(integerVP, unlocked);
+ assertFalse(view.isValueLocked(integerVP));
+
+ view.setLockedValue(integerVP, locked);
+ assertTrue(view.isValueLocked(integerVP));
+ assertEquals(locked, view.getVisualProperty(integerVP));
+
+ view.clearValueLock(integerVP);
+ assertEquals(unlocked, view.getVisualProperty(integerVP));
+
}
- @Test
- public void testClearValueLock() {
- // TODO add unit test
- }
+
@Test
- public void testGetSource() {
- assertNotNull( view.getModel() );
-
- // how to test type of source?
- }
-
- @Test
public void testAddViewChangeListener() {
- ViewChangeListener mock = createMock(ViewChangeListener.class);
- mock.visualPropertySet(intVP,5);
- replay(mock);
+// ViewChangeListener mock = createMock(ViewChangeListener.class);
+// mock.visualPropertySet(integerVP,5);
+// replay(mock);
// view.addViewChangeListener( mock );
- view.setVisualProperty(intVP,5);
+// view.setVisualProperty(integerVP,5);
//
// verify(mock);
}
@Test
public void testRemoveViewChangeListener() {
- ViewChangeListener mock = createMock(ViewChangeListener.class);
- mock.visualPropertySet(intVP,5);
- replay(mock);
+// ViewChangeListener mock = createMock(ViewChangeListener.class);
+// mock.visualPropertySet(integerVP,5);
+// replay(mock);
// view.addViewChangeListener( mock );
// view.setVisualProperty(intVP,5);
Added:
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/StringVisualProperty.java
===================================================================
---
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/StringVisualProperty.java
(rev 0)
+++
core3/viewmodel-api/trunk/src/test/java/org/cytoscape/view/model/StringVisualProperty.java
2010-08-18 00:04:40 UTC (rev 21423)
@@ -0,0 +1,18 @@
+package org.cytoscape.view.model;
+
+public class StringVisualProperty extends AbstractVisualProperty<String> {
+
+ public StringVisualProperty(final String type, final String
defaultValue,
+ final String id, final String name) {
+ super(type, defaultValue, id, name);
+ }
+
+ public String parseSerializableString(final String text) {
+ return text;
+ }
+
+ @Override
+ public String toSerializableString(String value) {
+ return value;
+ }
+}
\ No newline at end of file
Modified: core3/viewmodel-impl/trunk/pom.xml
===================================================================
--- core3/viewmodel-impl/trunk/pom.xml 2010-08-17 23:42:46 UTC (rev 21422)
+++ core3/viewmodel-impl/trunk/pom.xml 2010-08-18 00:04:40 UTC (rev 21423)
@@ -135,10 +135,43 @@
<!-- for spring integration testing -->
<dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>${junit.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.cytoscape</groupId>
<artifactId>integration-test-support</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.cytoscape</groupId>
+ <artifactId>model-impl</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.cytoscape</groupId>
+ <artifactId>model-impl</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.cytoscape</groupId>
+ <artifactId>event-api</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.cytoscape</groupId>
+ <artifactId>viewmodel-api</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <type>test-jar</type>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>
Modified:
core3/viewmodel-impl/trunk/src/main/java/org/cytoscape/view/model/internal/ViewImpl.java
===================================================================
---
core3/viewmodel-impl/trunk/src/main/java/org/cytoscape/view/model/internal/ViewImpl.java
2010-08-17 23:42:46 UTC (rev 21422)
+++
core3/viewmodel-impl/trunk/src/main/java/org/cytoscape/view/model/internal/ViewImpl.java
2010-08-18 00:04:40 UTC (rev 21423)
@@ -64,30 +64,36 @@
else
this.visualProperties.put(vp, value);
- cyEventHelper.getMicroListener(ViewChangeListener.class,
this).visualPropertySet(vp, value);
+ final ViewChangeListener vcl =
cyEventHelper.getMicroListener(ViewChangeListener.class, this);
+ if(vcl != null)
+ vcl.visualPropertySet(vp, value);
}
@SuppressWarnings("unchecked")
@Override
public <T> T getVisualProperty(VisualProperty<T> vp) {
- return (T) this.visualProperties.get(vp);
+ if(visualPropertyLocks.get(vp) == null)
+ return (T) this.visualProperties.get(vp);
+ else
+ return (T) this.visualPropertyLocks.get(vp);
}
+
// TODO: should I fire event?
@Override
public <T, V extends T> void setLockedValue(VisualProperty<? extends T>
vp,
V value) {
this.visualPropertyLocks.put(vp, value);
}
+
@Override
public boolean isValueLocked(VisualProperty<?> vp) {
- final Object lockedValue = this.visualPropertyLocks.get(vp);
- if(lockedValue != null)
+ if(visualPropertyLocks.get(vp) == null)
+ return false;
+ else
return true;
- else
- return false;
}
@Override
Added:
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/CyNetworkViewTest.java
===================================================================
---
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/CyNetworkViewTest.java
(rev 0)
+++
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/CyNetworkViewTest.java
2010-08-18 00:04:40 UTC (rev 21423)
@@ -0,0 +1,29 @@
+package org.cytoscape.viewmodel;
+
+import org.cytoscape.event.CyEventHelper;
+import org.cytoscape.event.DummyCyEventHelper;
+import org.cytoscape.model.TestCyNetworkFactory;
+import org.cytoscape.view.model.AbstractCyNetworkViewTest;
+import org.cytoscape.view.model.internal.NetworkViewImpl;
+import org.junit.After;
+import org.junit.Before;
+
+
+public class CyNetworkViewTest extends AbstractCyNetworkViewTest {
+
+ @Before
+ public void setUp() throws Exception {
+ network = TestCyNetworkFactory.getInstance();
+ buildNetwork();
+ final CyEventHelper mockHelper = new DummyCyEventHelper();
+ view = new NetworkViewImpl(network, mockHelper);
+ }
+
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+
+
+}
Added:
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/CyNodeViewTest.java
===================================================================
---
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/CyNodeViewTest.java
(rev 0)
+++
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/CyNodeViewTest.java
2010-08-18 00:04:40 UTC (rev 21423)
@@ -0,0 +1,49 @@
+package org.cytoscape.viewmodel;
+
+import static org.junit.Assert.*;
+import static org.junit.Assert.assertNotNull;
+
+import org.cytoscape.event.CyEventHelper;
+import org.cytoscape.event.DummyCyEventHelper;
+import org.cytoscape.model.CyNetwork;
+import org.cytoscape.model.CyNode;
+import org.cytoscape.model.TestCyNetworkFactory;
+import org.cytoscape.view.model.AbstractViewTest;
+import org.cytoscape.view.model.internal.ViewImpl;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CyNodeViewTest extends AbstractViewTest<CyNode> {
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+
+ final CyNetwork network = TestCyNetworkFactory.getInstance();
+ final CyNode node = network.addNode();
+
+ final CyEventHelper mockHelper = new DummyCyEventHelper();
+
+ view = new ViewImpl<CyNode>(node, mockHelper);
+
+ }
+
+
+ @After
+ public void tearDown() throws Exception {
+ }
+
+ @Test
+ public void testGetModel() {
+ assertNotNull( view.getModel() );
+
+ boolean modelTypeTest = false;
+ if(view.getModel() instanceof CyNode)
+ modelTypeTest = true;
+
+ assertTrue(modelTypeTest);
+
+ }
+
+}
Modified:
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/ITViewModelImpl.java
===================================================================
---
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/ITViewModelImpl.java
2010-08-17 23:42:46 UTC (rev 21422)
+++
core3/viewmodel-impl/trunk/src/test/java/org/cytoscape/viewmodel/ITViewModelImpl.java
2010-08-18 00:04:40 UTC (rev 21423)
@@ -2,27 +2,121 @@
import org.cytoscape.view.model.CyNetworkViewFactory;
import org.cytoscape.view.model.RootVisualLexicon;
-import org.cytoscape.integration.AbstractIntegrationTester;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
+import org.springframework.osgi.test.AbstractConfigurableBundleCreatorTests;
+import org.springframework.osgi.util.OsgiStringUtils;
/**
* Integration test for viewmodel-impl bundle.
*
* @author kono
- * @author mes
+ *
*/
-public class ITViewModelImpl extends AbstractIntegrationTester {
+public class ITViewModelImpl extends AbstractConfigurableBundleCreatorTests {
- public ITViewModelImpl() {
- super( "org.cytoscape.viewmodel-impl",
- new String[] { "org.cytoscape, event-api, 1.0-SNAPSHOT",
- "org.cytoscape, event-impl, 1.0-SNAPSHOT",
- "org.cytoscape, model-api, 1.0-SNAPSHOT",
- "org.cytoscape, integration-test-support,
1.0-SNAPSHOT",
- "org.cytoscape, service-util,
1.0-SNAPSHOT",
- "org.cytoscape, viewmodel-api,
1.0-SNAPSHOT",
- "org.cytoscape, viewmodel-impl,
1.0-SNAPSHOT", },
- new String[] { "rootVisualLexicon",
"cyNetworkViewFactory" },
- new Class[] { RootVisualLexicon.class,
CyNetworkViewFactory.class }
- );
+ // Exported services (FROM viewmodel-impl bundle)
+ private RootVisualLexicon rootVisualLexicon;
+ private CyNetworkViewFactory cyNetworkViewFactory;
+
+ // Inject those services to this test (by setter injection)
+ public void setRootVisualLexicon(RootVisualLexicon rootVisualLexicon) {
+ this.rootVisualLexicon = rootVisualLexicon;
}
+
+ public void setCyNetworkViewFactory(
+ CyNetworkViewFactory cyNetworkViewFactory) {
+ this.cyNetworkViewFactory = cyNetworkViewFactory;
+ }
+
+ public void testOsgiPlatformStarts() throws Exception {
+ System.out.println("###### Starting Integration Test ######");
+ // Make sure bundle context exists.
+ assertNotNull(bundleContext);
+
+ System.out.println(bundleContext
+ .getProperty(Constants.FRAMEWORK_VENDOR));
+ System.out.println(bundleContext
+ .getProperty(Constants.FRAMEWORK_VERSION));
+ System.out.println(bundleContext
+
.getProperty(Constants.FRAMEWORK_EXECUTIONENVIRONMENT));
+
+ final Bundle[] bundles = bundleContext.getBundles();
+
+ Bundle viewModelImplBundle = null;
+ for (int i = 0; i < bundles.length; i++) {
+ final Bundle bundle = bundles[i];
+ final String bundleName =
OsgiStringUtils.nullSafeName(bundle);
+ System.out.println(bundleName);
+ if (bundleName.equals("org.cytoscape.viewmodel-impl"))
+ viewModelImplBundle = bundle;
+ ServiceReference[] services =
bundle.getRegisteredServices();
+ if (services != null)
+ for (ServiceReference ref : services)
+ System.out.println("\tService = " +
ref);
+ System.out.println("\n");
+ }
+
+ // Make sure viewmodel-impl bundle is running
+ assertNotNull(viewModelImplBundle);
+
+ System.out.println("###### ViewModel bundle registered.
######");
+ }
+
+ public void testServiceReferencesExist() {
+ System.out.println("###### Starting Service Reference Tests
######");
+ final ServiceReference rootVisualLexiconServiceReference =
bundleContext
+
.getServiceReference(RootVisualLexicon.class.getName());
+ assertNotNull(rootVisualLexiconServiceReference);
+ Object beanName = rootVisualLexiconServiceReference
+
.getProperty("org.springframework.osgi.bean.name");
+ assertEquals("rootVisualLexicon", beanName);
+
+ final ServiceReference cyNetworkViewFactoryServiceReference =
bundleContext
+
.getServiceReference(CyNetworkViewFactory.class.getName());
+ assertNotNull(cyNetworkViewFactoryServiceReference);
+ beanName = cyNetworkViewFactoryServiceReference
+
.getProperty("org.springframework.osgi.bean.name");
+ assertEquals("cyNetworkViewFactory", beanName);
+
+ System.out.println("###### SR test done! ######");
+ }
+
+ /**
+ * Do very basic tests for injected services. Complete tests for all
methods
+ * will be done in the Unit tests.
+ *
+ */
+ public void testInjectedServices() {
+ System.out.println("###### Simple tests for injected services
######");
+ assertNotNull(rootVisualLexicon);
+ assertNotNull(cyNetworkViewFactory);
+ System.out.println("###### Injected services pass the tests.
######");
+ }
+
+ /**
+ * Specify Spring DM config file to import registered services by
+ * viewmodel-impl bundle.
+ *
+ */
+ @Override
+ protected String[] getConfigLocations() {
+ return new String[] {
"file:./target/test-classes/META-INF/spring/bundle-context-test.xml" };
+ }
+
+ /**
+ * Import bundles required to run viewmodel-impl bundle.
+ */
+ @Override
+ protected String[] getTestBundlesNames() {
+ return new String[] {
+ "org.cytoscape, event-api, 1.0-SNAPSHOT",
+ "org.cytoscape, event-impl, 1.0-SNAPSHOT",
+ "org.cytoscape, model-api, 1.0-SNAPSHOT",
+ "org.cytoscape, service-util, 1.0-SNAPSHOT",
+ "org.cytoscape, viewmodel-api, 1.0-SNAPSHOT",
+ "org.cytoscape, viewmodel-impl, 1.0-SNAPSHOT"
+ };
+ }
}
--
You received this message because you are subscribed to the Google Groups
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/cytoscape-cvs?hl=en.