C:/nobackup/private/physical_svn/trunk/test/manual_test.cpp

Go to the documentation of this file.
00001 
00002 /*=============================================================================
00003     physical quantities / units / constants
00004     Copyright (c) 2006, 2007 Martin Schulz
00005     http://physical.sourceforge.net
00006   
00007     This is private code by Martin Schulz.
00008   
00009     Use, modification and distribution is subject to the Boost Software
00010     License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
00011     http://www.boost.org/LICENSE_1_0.txt)
00012 =============================================================================*/
00013 
00014 #include <boost/test/auto_unit_test.hpp>
00015 
00016 // this is the old "main" program. Use as building blocks for other test cases...
00017 
00018 
00019 /* ************************************************************************************** */
00020 
00021 #include "physical/exception.hpp"
00022 #include "physical/fixedphysical.hpp"
00023 #include "physical/dynamicunit.hpp"
00024 #include "physical/quantity.hpp"
00025 #include "physical/unit.hpp"
00026 #include "physical/unitsymbol.hpp"
00027 #include "physical/format.hpp"
00028 #include "physical/parser.hpp"
00029 #include "physical/dimension.hpp"
00030 #include "physical/autoformat.hpp"
00031 
00032 #include <iostream>
00033 #include "physical/autoformat.hpp"
00034 
00035 
00036 void try_to_parse(std::string formula) {
00037    physical::parser::Parser p;
00038 
00039    try {
00040       physical::DynamicPhysical<SI> q = p.parse(formula);
00041       std::cout << "parsing of " << formula << " succeeded: " << q <<"\n";
00042 
00043    } catch(const physical::parser::parser_exception& e) {
00044       std::cout << "parsing of " << formula << " failed after " << e.string_to_parse.substr(0, e.sucessfully_parsed_up_to) << "\n";
00045    };
00046 
00047 };
00048 
00049 
00050 BOOST_AUTO_UNIT_TEST( manual_test ) {
00051 
00052    namespace quantity=physical::quantity_si_double;
00053         namespace unit=physical::unit_si_float;
00054         using physical::DynamicPhysical;
00055         using physical::DynamicUnit;
00056         using physical::format::format;
00057         using physical::format::FormatSpec;
00058 
00059         std::cout << "Hello World!\n";
00060 
00061         std::cout << "numerical value of meter: " << unit::meter.numerical_value << "\n";
00062         std::cout << "numerical value of kilometer: " << unit::kilometer.numerical_value << "\n";
00063 
00064         std::cout << "numerical value of hour: " << unit::hour.numerical_value << "\n";
00065 
00066         DynamicUnit<SI> d_hour(unit::hour);
00067         DynamicPhysical<SI> day= 24*unit::hour;
00068 
00069         std::cout << "numerical value of day: " << day.numerical_value << "\n";
00070 
00071         double spd = (day / DynamicPhysical<SI>(unit::second) ).numerical_value; // FIXME automatic conversion should work again!!!
00072         std::cout << "number of seconds per day: " << spd << "\n";
00073 
00074         std::cout << "day = " << day << "\n";
00075 
00076         quantity::mass  m = unit::gram;
00077 
00078         // FormatSpecs can be stored and handles e.g. by standard containers:
00079         std::vector<FormatSpec<SI>> hourspecs;
00080         hourspecs.push_back(FormatSpec<SI>("h",unit::hour,2)); 
00081         hourspecs.push_back(FormatSpec<SI>("hour(s)",unit::hour,2));
00082         hourspecs.push_back(FormatSpec<SI>("Stunde(n)",unit::hour,2));
00083         hourspecs.push_back(FormatSpec<SI>("heure(s)",unit::hour,2));
00084 
00085 
00086         std::cout << "day = " << format(day, hourspecs[0]) << "\n";
00087         std::cout << "day = " << format(day, hourspecs[1]) << "\n";
00088         std::cout << "day = " << format(day, hourspecs[2]) << "\n";
00089         std::cout << "day = " << format(day, hourspecs[3]) << "\n";
00090 
00091         // pre-created formatter object
00092         physical::format::formatter<SI> f(hourspecs[3]);
00093         std::cout << "day = " << f(day) << "\n";
00094 
00095 
00096         physical::format::Dimension("units of time usually used by machines", unit::second);
00097         physical::format::Dimension human_clock 
00098                 = physical::format::DimensionDef<quantity::time>("units of time usually used by humans")
00099                 .add(FormatSpec<SI>("hours", unit::hour, 2))
00100                 .add(FormatSpec<SI>("minutes", 60*unit::second, 0))
00101                 .add(FormatSpec<SI>("seconds", unit::second, 0));
00102 
00103         
00104         std::cout << "day/dimension = " << format(day, human_clock.get(0)) << "\n";
00105         std::cout << "day/dimension = " << format(human_clock.get(0))(day) << "\n";
00106 
00107         quantity::velocity velocity = 50*unit::kilometer/unit::hour;
00108         DynamicPhysical<SI> dvelocity = 50*unit::kilometer/unit::hour;
00109 
00110         std::cout << "50kmh = " << DynamicPhysical<SI>(velocity) << "\n"; // FIXME automatic conversion should work again!!!
00111         std::cout << "50kmh = " << dvelocity << "\n";
00112 
00113         quantity::length side = 20*unit::meter;
00114         quantity::area square = side*side;
00115         std::cout << "area = " << DynamicPhysical<SI>(square) << "\n"; // FIXME automatic conversion should work again!!!
00116         
00117         FormatSpec<SI> areaspec("m*m", unit::meter*unit::meter, 3);
00118         std::cout << "area = " << format(DynamicPhysical<SI>(square), areaspec) << "\n";// FIXME automatic conversion should work again!!!
00119 
00120 
00121         quantity::temperature temp= 18*unit::celsius; // implicit conversion DynamicPhysical->FixedPhysical
00122         DynamicPhysical<SI> temp2= 20*unit::celsius;
00123 
00124         try {
00125                 // this is an invalid conversion and should throw an exception:
00126                 DynamicPhysical<SI> length = 200*unit::meter;
00127                 quantity::temperature temp = length;
00128         } catch(const std::exception& e) {
00129                 std::cout << "Could not convert length to temperature: " << e.what() << "\n";
00130         }
00131 
00132         std::cout << "celsius.factor " << unit::celsius.scale.factor << "\n";
00133         std::cout << "celsius.origin " << unit::celsius.scale.origin << "\n";
00134 
00135         std::cout << "temp.numerical_value " << temp.numerical_value << "\n";
00136 
00137         std::cout << "temp.numerical_value " << temp.numerical_value << "\n";
00138 
00139         std::cout << "room temperature = " << format<SI>(temp, FormatSpec<SI>("K", unit::kelvin, 4)) << "\n";
00140         std::cout << "room temperature = " << format<SI>(temp, FormatSpec<SI>("C", unit::celsius, 4)) << "\n";
00141 
00142         quantity::temperature freezing_point = 0*unit::celsius;
00143 
00144         std::cout << "freezing_point = " << format<SI>(freezing_point, FormatSpec<SI>("K", unit::kelvin, 4)) << "\n";
00145         std::cout << "freezing_point = " << format<SI>(freezing_point, FormatSpec<SI>("C", unit::celsius, 4)) << "\n";
00146         std::cout << "freezing_point = " << format<SI>(freezing_point, FormatSpec<SI>("F", unit::fahrenheit, 4)) << "\n";
00147         std::cout << "freezing_point = " << format<SI>(freezing_point, FormatSpec<SI>("R", unit::reaumur, 4)) << "\n";
00148 
00149         quantity::temperature boiling_point = 100*unit::celsius;
00150 
00151         std::cout << "boiling_point = " << format<SI>(boiling_point, FormatSpec<SI>("K", unit::kelvin, 4)) << "\n";
00152         std::cout << "boiling_point = " << format<SI>(boiling_point, FormatSpec<SI>("C", unit::celsius, 4)) << "\n";
00153         std::cout << "boiling_point = " << format<SI>(boiling_point, FormatSpec<SI>("F", unit::fahrenheit, 4)) << "\n";
00154         std::cout << "boiling_point = " << format<SI>(boiling_point, FormatSpec<SI>("R", unit::reaumur, 4)) << "\n";
00155 
00156         // try the parser:
00157         try_to_parse("0.5");
00158         try_to_parse("1.5[]");
00159         try_to_parse("2.5[1]");
00160         try_to_parse("3.5[123]");
00161         try_to_parse("4.5[m]");
00162         try_to_parse("5.5[kg]");
00163         try_to_parse("6.5[kg^5]");
00164         try_to_parse("7.5[m*A*s^-1*kg^5]");
00165         try_to_parse("8.5[m]");
00166         try_to_parse("9.5[m*A]");
00167         try_to_parse("10.5[m*A*s^-1]");
00168         try_to_parse("11.5[m*A*s^-1*kg^5]");
00169         try_to_parse("12.5[m*s*grad]");
00170         try_to_parse("13.5[m*s*Grad]");
00171         try_to_parse("14.5[rad]");
00172         try_to_parse("15.5[m/s]");
00173 
00174 };

Generated on Mon Apr 2 22:25:06 2007 for physical_svn by  doxygen 1.5.1-p1
hosted on SourceForge.net Logo