public void ComplexConcreteDataTest()
        {
            metadataTypeId = metadataApi.AddType("OpenSourceLicense", "ConcreteData", null, ObjectMetadataTypes.Custom, false, null);
            metadataApi.SaveField(metadataTypeId, new StringFieldMetadata { Name = "Copyright" });
            metadataApi.SaveField(metadataTypeId, new DateTimeFieldMetadata { Name = "CreatedOn" });

            const string LICENSE = "License";
            string GPLv2Description = "The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.";
            ConcreteDataObject GPLv2 = new ConcreteDataObject
            {
                Type = LICENSE,
                Name = "GNU General Public License version 2",
                Value = "GPLv2",
                ExtensionDataTypeId = metadataTypeId,
                Description = GPLv2Description
            };

            GPLv2["Copyright"] = "Free Software Foundation, Inc";
            GPLv2["CreatedOn"] = new DateTime(1989, 1, 1);
            concreteDataApi.Save(GPLv2);

            ConcreteDataObject Apache = new ConcreteDataObject
            {
                Type = LICENSE,
                Name = "Apache License",
                Value = "Apache",
                ExtensionDataTypeId = metadataTypeId,
                Description = "Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form."
            };

            Apache["Copyright"] = "Apache License";
            Apache["CreatedOn"] = new DateTime(2004, 1, 1);
            concreteDataApi.Save(Apache);

            IEnumerable<ConcreteDataObject> licenses = concreteDataApi.FindAllByType(LICENSE);
            Assert.AreEqual(2, licenses.Count());

            int recordCount;
            LinqPredicate predicate = new LinqPredicate("Value=@0 AND TYPE=@1", "GPLv2", LICENSE);
            licenses = concreteDataApi.FindConcreteData(predicate, null, 0, 10, out recordCount);

            Assert.AreEqual(1, recordCount);
            GPLv2 = licenses.First();
            Assert.AreEqual("GNU General Public License version 2", GPLv2.Name);
            Assert.AreEqual("GPLv2", GPLv2.Value);
            Assert.AreEqual(GPLv2Description, GPLv2.Description);
            Assert.AreEqual("Free Software Foundation, Inc", GPLv2["Copyright"]);
            Assert.AreEqual(new DateTime(1989, 1, 1), GPLv2["CreatedOn"]);
        }
        /// <summary>
        /// Get the copy of current object.
        /// </summary>
        /// <returns></returns>
        public ConcreteDataObject Clone()
        {
            ConcreteDataObject copy = new ConcreteDataObject
            {
                ConcreteDataId = this.ConcreteDataId,
                Type = this.Type,
                Name = this.Name,
                Value = this.Value,
                DeleteStatus = this.DeleteStatus,
                Description = this.Description,
                CreatedBy = this.CreatedBy,
                CreatedDate = this.CreatedDate,
                LastUpdatedBy = this.LastUpdatedBy,
                LastUpdatedDate = this.LastUpdatedDate,
                ExtensionDataTypeId = this.ExtensionDataTypeId
            };

            this.ClonePropertiesTo(copy);
            return copy;
        }
        public void ConcreteDataWithinDifferentTypesTest()
        {
            const string DEGREE = "Degree";
            const string CITY = "City";

            ConcreteDataObject master = new ConcreteDataObject { Type = DEGREE, Name = "Master" };
            ConcreteDataObject regularCollege = new ConcreteDataObject { Type = DEGREE, Name = "Regular College" };
            ConcreteDataObject juniorCollege = new ConcreteDataObject { Type = DEGREE, Name = "Junior College" };

            ConcreteDataObject shanghai = new ConcreteDataObject { Type = CITY, Name = "Shanghai" };
            ConcreteDataObject beijing = new ConcreteDataObject { Type = CITY, Name = "Beijing" };

            concreteDataApi.Save(master);
            concreteDataApi.Save(regularCollege);
            concreteDataApi.Save(juniorCollege);

            concreteDataApi.Save(shanghai);
            concreteDataApi.Save(beijing);

            IEnumerable<ConcreteDataObject> degrees = concreteDataApi.FindAllByType(DEGREE);
            Assert.AreEqual(3, degrees.Count());

            IEnumerable<ConcreteDataObject> cities = concreteDataApi.FindAllByType(CITY);
            Assert.AreEqual(2, cities.Count());

            int recordCount;
            LinqPredicate predicate = new LinqPredicate("Name.EndsWith(@0) AND Type=@1", "College", DEGREE);
            degrees = concreteDataApi.FindConcreteData(predicate, null, 0, 10, out recordCount);
            Assert.AreEqual(2, recordCount);

            predicate = new LinqPredicate("Name=@0 AND Type=@1", "Shanghai", CITY);
            degrees = concreteDataApi.FindConcreteData(predicate, null, 0, 10, out recordCount);
            Assert.AreEqual(1, recordCount);
        }
        public void ConcreteDataSimpleTest()
        {
            const string DEGREE = "Degree";
            ConcreteDataObject master = new ConcreteDataObject { Type = DEGREE, Name = "Master" };
            ConcreteDataObject regularCollege = new ConcreteDataObject { Type = DEGREE, Name = "Regular College" };
            ConcreteDataObject juniorCollege = new ConcreteDataObject { Type = DEGREE, Name = "Junior College" };

            concreteDataApi.Save(master);
            concreteDataApi.Save(regularCollege);
            concreteDataApi.Save(juniorCollege);

            IEnumerable<ConcreteDataObject> degrees = concreteDataApi.FindAllByType(DEGREE);
            Assert.AreEqual(3, degrees.Count());

            int recordCount;
            LinqPredicate predicate = new LinqPredicate("Name.EndsWith(@0) AND Type=@1", "College", DEGREE);
            degrees = concreteDataApi.FindConcreteData(predicate, null, 0, 10, out recordCount);
            Assert.AreEqual(2, recordCount);
        }
        public void TestQuery()
        {
            ConcreteDataManagement page = new ConcreteDataManagement();

            DynamicPageProxy proxy = new DynamicPageProxy(page);

            IConcreteDataApi concreteDataApi = SpringContext.Current.GetObject<IConcreteDataApi>();

            using (var httpEnv = new HttpEnvironment())
            {
                #region Create Data
                Guid guid = Guid.NewGuid();
                string surfix = guid.ToString().Substring(0, 5);
                ConcreteDataObject testConcreteData = new ConcreteDataObject()
                {
                    Name = "concrete" + surfix,
                    Value = "concrete" + surfix,
                    Type = "Department",
                    DeleteStatus = DeleteStatus.NotDeleted
                };

                concreteDataApi.Save(testConcreteData);
                ids.Add(testConcreteData.ConcreteDataId);
                #endregion

                httpEnv.SetRequestUrl(@"/ConcreteDataDetailPanel/DynamicPage.svc?ConcreteDataType=Department");

                QueryParameterExpression expression = new QueryParameterExpression("Name", QueryFieldOperators.Equal, "concrete" + surfix);

                SortExpression sort = new SortExpression("Name");

                QueryParameter parameters = new QueryParameter()
                {
                    //Expressions = express,
                    PageIndex = 0,
                    PageSize = 10,
                    SortExpression = sort
                };

                parameters.Expressions.Add(expression);

                QueryResults results = proxy.Query(parameters);

                foreach (var result in results.Results)
                {
                    Assert.AreEqual(DataBinder.Eval(result, "Name"), "concrete" + surfix);
                }
            }
        }
        public void TestUpdate()
        {
            ConcreteDataDetailPanel page = new ConcreteDataDetailPanel();

            DetailPanelPageProxy proxy = new DetailPanelPageProxy(page);

            IConcreteDataApi concreteDataApi = SpringContext.Current.GetObject<IConcreteDataApi>();
            using (var httpEnv = new HttpEnvironment())
            {
                Guid guid = Guid.NewGuid();

                string surfix = guid.ToString().Substring(0, 5);

                httpEnv.SetRequestUrl(@"/ConcreteDataDetailPanel/DynamicPage.svc?ConcreteDataType=Department");

                ConcreteDataObject obj = new ConcreteDataObject()
                {
                    Name = "concrete" + surfix,
                    Value = "concrete" + surfix,
                    Type = "Department",
                    DeleteStatus = DeleteStatus.NotDeleted
                };

                concreteDataApi.Save(obj);

                #region Bind Control
                TextBox TextBoxName = new TextBox();
                TextBoxName.Text = "concrete" + surfix;
                proxy.Set("TextBoxName", TextBoxName);

                TextBox TextBoxValue = new TextBox();
                TextBoxValue.Text = "concreteUpdate" + surfix;
                proxy.Set("TextBoxValue", TextBoxValue);

                Array statusData = new string[] { "NotDeleted", "Deleted" };
                RadioButtonList RadioButtonListStatus = new RadioButtonList();
                RadioButtonListStatus.DataSource = statusData;
                RadioButtonListStatus.DataBind();
                RadioButtonListStatus.SelectedIndex = 0;
                proxy.Set("RadioButtonListStatus", RadioButtonListStatus);

                proxy.Set("ExtensionDataForm", null);
                #endregion

                proxy.Update(obj.ConcreteDataId.ToString());

                Assert.AreEqual(obj.Value, "concrete" + surfix);

                obj = concreteDataApi.GetById(obj.ConcreteDataId);

                Assert.AreEqual(obj.Value, "concreteUpdate" + surfix);

            }
        }