Module: environment-reports Author: Andy Armstrong Synopsis: Test suite report generator Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND /// Test suite skeleton generation define class (, ) end class ; //---*** Ultimately this should be available in all editions... install-report(#"test-suite", "Project test suite skeleton", , edition: #"internal"); /// Report protocols define method write-report-as (stream :: , report :: , _format == #"text") => () let project = report.report-project; let library = project.project-library; let library-name = environment-object-primitive-name(project, library); let module-names = namespace-exported-names(project, library); format(stream, "Module: %s-test-suite\n", library-name); format(stream, "\n"); format(stream, "define library-spec %s ()\n", library-name); for (name :: in module-names) format(stream, " module %s;\n", as-lowercase(environment-object-primitive-name(project, name))) end; format(stream, "end library-spec %s;\n", library-name); for (name :: in module-names) let module = name-value(project, name); let module-name = environment-object-primitive-name(project, name); let names = module-names-to-document(project, module); format(stream, "\n"); format(stream, "define module-spec %s ()\n", module-name); for (name :: in names) let value = name-value(project, name); write-binding-spec(stream, report, name, value) end; format(stream, "end module-spec %s;\n", module-name) end; for (name :: in module-names) let module = name-value(project, name); let module-name = environment-object-primitive-name(project, name); let names = module-names-to-document(project, module); for (name :: in names) let value = name-value(project, name); let class-name = select (value by instance?) => "class"; => "constant"; => "function"; => "macro"; => "variable"; end; let print-name = environment-object-primitive-name(project, name); let test-suffix = if (instance?(value, )) "-test" else "" end; format(stream, "\n"); format(stream, "define %s %s-test %s%s ()\n", module-name, class-name, print-name, test-suffix); format(stream, " //---*** Fill this in...\n"); format(stream, "end %s-test %s%s;\n", class-name, print-name, test-suffix) end end end method write-report-as; define method write-binding-spec (stream :: , report :: , name :: , variable :: ) => () let project = report.report-project; let name = environment-object-primitive-name(project, name); let type = variable-type(project, variable); format(stream, " %s %s :: ", select (variable by instance?) => "constant"; otherwise => "variable"; end, name); //---*** What to do with unexported types? print-environment-object-name (stream, project, type, qualify-names?: #f); format(stream, ");\n") end method write-binding-spec; define method write-binding-spec (stream :: , report :: , name :: , class :: ) => () let project = report.report-project; let name = environment-object-primitive-name(project, name); let separator = ""; format(stream, " class %s (", name); for (superclass in class-direct-superclasses(project, class)) format(stream, "%s", separator); //---*** What to do with unexported types? print-environment-object-name (stream, project, superclass, qualify-names?: #f); separator := ", " end; format(stream, ");\n") end method write-binding-spec; define method write-binding-spec (stream :: , report :: , name :: , function :: ) => () let project = report.report-project; //---*** Flesh this out, handle generics etc... format(stream, " function %s;\n", environment-object-primitive-name(project, name)) end method write-binding-spec; define method write-binding-spec (stream :: , report :: , name :: , macro-object :: ) => () let project = report.report-project; format(stream, " macro-test %s-test;\n", environment-object-primitive-name(project, name)) end method write-binding-spec; define method write-report-as (stream :: , report :: , _format == #"html") => () error("Not yet implemented!") end method write-report-as; define method create-multi-file-report-as (report :: , directory :: , _format == #"text") => (filename :: ) report.report-directory := directory; let project = report.report-project; let library = project.project-library; let library-name = environment-object-primitive-name(project, library); error("Not yet implemented!") end method create-multi-file-report-as; /// Utilities define method namespace-exported-names (project :: , namespace :: ) => (names :: ) let names :: = make(); do-namespace-names (method (name :: ) if (name-exported?(project, name)) add!(names, name) end end, project, namespace); names end method namespace-exported-names; define method module-names-to-document (project :: , module :: ) => (names :: ) //---*** We should group these by class, if possible namespace-exported-names(project, module) end method module-names-to-document;