diff --git a/test/experiment_options_test.dart b/test/experiment_options_test.dart
index 6772bfd..d091f04 100644
--- a/test/experiment_options_test.dart
+++ b/test/experiment_options_test.dart
@@ -7,21 +7,16 @@
 
 import 'dart:io';
 
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:dartdoc/src/dartdoc_options.dart';
 import 'package:dartdoc/src/experiment_options.dart';
-import 'package:path/path.dart' as pathLib;
 import 'package:test/test.dart';
 
-class DartdocExperimentOptionContextTester extends DartdocOptionContext {
-  DartdocExperimentOptionContextTester(
-      DartdocOptionSet optionSet, FileSystemEntity entity)
-      : super(optionSet, entity);
-}
-
 void main() {
   DartdocOptionSet experimentOptions;
-  Directory tempDir;
-  File optionsFile;
+  Directory emptyTempDir;
+  ExperimentalFeature defaultOnNotExpired, defaultOffNotExpired;
+  ExperimentalFeature defaultOnExpired, defaultOffExpired;
 
   setUp(() async {
     experimentOptions = await DartdocOptionSet.fromOptionGenerators(
@@ -29,40 +24,60 @@
   });
 
   setUpAll(() {
-    tempDir = Directory.systemTemp.createTempSync('experiment_options_test');
-    optionsFile = new File(pathLib.join(tempDir.path, 'dartdoc_options.yaml'))
-      ..createSync();
-    optionsFile.writeAsStringSync('''
-dartdoc:
-  enable-experiment:
-    - constant-update-2018
-    - fake-experiment
-    - no-fake-experiment-on
-''');
+    emptyTempDir =
+        Directory.systemTemp.createTempSync('experiment_options_test_empty');
+    // We don't test our functionality at all unless ExperimentStatus has at least
+    // one of these.  TODO(jcollins-g): make analyzer+dartdoc connection
+    // more amenable to testing.
+    defaultOnNotExpired = ExperimentStatus.knownFeatures.values.firstWhere(
+        (f) => f.isEnabledByDefault && !f.isExpired,
+        orElse: () => null);
+    defaultOffNotExpired = ExperimentStatus.knownFeatures.values.firstWhere(
+        (f) => !f.isEnabledByDefault && !f.isExpired,
+        orElse: () => null);
+    assert(defaultOnNotExpired != null || defaultOffNotExpired != null,
+        'No experimental options that are not expired found');
+
+    // The "bogus" entries should always exist.
+    defaultOnExpired = ExperimentStatus.knownFeatures.values
+        .firstWhere((f) => f.isEnabledByDefault && f.isExpired);
+    defaultOffExpired = ExperimentStatus.knownFeatures.values
+        .firstWhere((f) => !f.isEnabledByDefault && f.isExpired);
   });
 
   tearDownAll(() {
-    tempDir.deleteSync(recursive: true);
+    emptyTempDir.deleteSync(recursive: true);
   });
 
   group('Experimental options test', () {
     test('Defaults work for all options', () {
       experimentOptions.parseArguments([]);
-      DartdocExperimentOptionContextTester tester =
-          new DartdocExperimentOptionContextTester(
-              experimentOptions, Directory.current);
-      expect(tester.experimentStatus.constant_update_2018, isFalse);
-      expect(tester.experimentStatus.set_literals, isFalse);
+      DartdocOptionContext tester =
+          new DartdocOptionContext(experimentOptions, emptyTempDir);
+      if (defaultOnNotExpired != null)
+        expect(tester.experimentStatus.isEnabled(defaultOnNotExpired), isTrue);
+      if (defaultOffNotExpired != null)
+        expect(
+            tester.experimentStatus.isEnabled(defaultOffNotExpired), isFalse);
+      expect(tester.experimentStatus.isEnabled(defaultOnExpired), isTrue);
+      expect(tester.experimentStatus.isEnabled(defaultOffExpired), isFalse);
     });
 
     test('Overriding defaults works via args', () {
-      experimentOptions.parseArguments(
-          ['--enable-experiment', 'constant-update-2018,set-literals']);
-      DartdocExperimentOptionContextTester tester =
-          new DartdocExperimentOptionContextTester(
-              experimentOptions, Directory.current);
-      expect(tester.experimentStatus.constant_update_2018, isTrue);
-      expect(tester.experimentStatus.set_literals, isTrue);
+      // Set all arguments to non-default values.
+      experimentOptions.parseArguments([
+        '--enable-experiment',
+        '${defaultOffNotExpired?.disableString},${defaultOnNotExpired?.disableString},${defaultOnExpired.disableString},${defaultOffExpired.enableString}'
+      ]);
+      DartdocOptionContext tester =
+          new DartdocOptionContext(experimentOptions, emptyTempDir);
+      if (defaultOnNotExpired != null)
+        expect(tester.experimentStatus.isEnabled(defaultOnNotExpired), isFalse);
+      if (defaultOffNotExpired != null)
+        expect(
+            tester.experimentStatus.isEnabled(defaultOffNotExpired), isFalse);
+      expect(tester.experimentStatus.isEnabled(defaultOnExpired), isTrue);
+      expect(tester.experimentStatus.isEnabled(defaultOffExpired), isFalse);
     });
   });
 }
