code: def test_save_restore(self):
      table = Table({"a": [1, 2, 3]})
      viewer = PerspectiveViewer(
          plugin="X Bar",
          filter=[["a", "==", 2]],
          expressions={'"a" * 2': '"a" * 2'},
      )
      viewer.load(table)
  
      # Save config
      config = viewer.save()
      assert viewer.filter == [["a", "==", 2]]
      assert config["filter"] == [["a", "==", 2]]
      assert viewer.plugin == "X Bar"
      assert config["plugin"] == "X Bar"
      assert config["expressions"] == {'"a" * 2': '"a" * 2'}
  
      # reset configuration
      viewer.reset()
      assert viewer.plugin == "Datagrid"
      assert viewer.filter == []
      assert viewer.expressions == {}
  
      # restore configuration
      viewer.restore(**config)
      assert viewer.filter == [["a", "==", 2]]
      assert viewer.plugin == "X Bar"
      assert viewer.expressions == {'"a" * 2': '"a" * 2'}
  
imports: import numpy
  import pandas
  from perspective import PerspectiveViewer, Table
label_desc: Use image node_id 23 for calling the TestViewer obj's underlying member method code with example usage: obj.test_save_restore() without return types