/// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="user">The AdWords user.</param>
        /// <param name="campaignId">The campaign id to add product scope.</param>
        public void Run(AdWordsUser user, long campaignId)
        {
            // Get the CampaignCriterionService.
              CampaignCriterionService campaignCriterionService =
              (CampaignCriterionService) user.GetService(
              AdWordsService.v201601.CampaignCriterionService);

              ProductScope productScope = new ProductScope();
              // This set of dimensions is for demonstration purposes only. It would be
              // extremely unlikely that you want to include so many dimensions in your
              // product scope.
              ProductBrand nexusBrand = new ProductBrand();
              nexusBrand.value = "Nexus";

              ProductCanonicalCondition newProducts = new ProductCanonicalCondition();
              newProducts.condition = ProductCanonicalConditionCondition.NEW;

              ProductCustomAttribute customAttribute = new ProductCustomAttribute();
              customAttribute.type = ProductDimensionType.CUSTOM_ATTRIBUTE_0;
              customAttribute.value = "my attribute value";

              ProductOfferId bookOffer = new ProductOfferId();
              bookOffer.value = "book1";

              ProductType mediaProducts = new ProductType();
              mediaProducts.type = ProductDimensionType.PRODUCT_TYPE_L1;
              mediaProducts.value = "Media";

              ProductType bookProducts = new ProductType();
              bookProducts.type = ProductDimensionType.PRODUCT_TYPE_L2;
              bookProducts.value = "Books";

              // The value for the bidding category is a fixed ID for the
              // 'Luggage & Bags' category. You can retrieve IDs for categories from
              // the ConstantDataService. See the 'GetProductCategoryTaxonomy' example
              // for more details.
              ProductBiddingCategory luggageBiddingCategory = new ProductBiddingCategory();
              luggageBiddingCategory.type = ProductDimensionType.BIDDING_CATEGORY_L1;
              luggageBiddingCategory.value = -5914235892932915235;

              productScope.dimensions = new ProductDimension[] {nexusBrand, newProducts, bookOffer,
              mediaProducts, luggageBiddingCategory};

              CampaignCriterion campaignCriterion = new CampaignCriterion();
              campaignCriterion.campaignId = campaignId;
              campaignCriterion.criterion = productScope;

              // Create operation.
              CampaignCriterionOperation operation = new CampaignCriterionOperation();
              operation.operand = campaignCriterion;
              operation.@operator = Operator.ADD;

              try {
            // Make the mutate request.
            CampaignCriterionReturnValue result = campaignCriterionService.mutate(
            new CampaignCriterionOperation[] { operation });

            Console.WriteLine("Created a ProductScope criterion with ID '{0}'",
              result.value[0].criterion.id);
              } catch (Exception e) {
            throw new System.ApplicationException("Failed to set shopping product scope.", e);
              }
        }
        public void TestProductTypeEquals()
        {
            ProductType productTypeA = new ProductType() {
            type = ProductDimensionType.BRAND,
            value = "google",
              };

              ProductType productTypeATitleCase = new ProductType() {
            type = ProductDimensionType.BRAND,
            value = "Google",
              };

              ProductType productTypeB = new ProductType() {
            type = ProductDimensionType.BRAND,
            value = "google"
              };

              ProductType productTypeC = new ProductType() {
            type = ProductDimensionType.CHANNEL,
            value = "google"
              };

              ProductType productTypeD = new ProductType() {
            type = ProductDimensionType.BRAND,
            value = "motorola"
              };

              ProductType productTypeE = new ProductType() {
            type = ProductDimensionType.BRAND,
              };

              ProductType productTypeF = new ProductType() {
            type = ProductDimensionType.BRAND,
              };

              ProductType productTypeG = new ProductType();
              ProductType productTypeH = new ProductType();

              Assert.True(comparer.Equals(productTypeA, productTypeB));
              Assert.False(comparer.Equals(productTypeA, productTypeC));
              Assert.False(comparer.Equals(productTypeA, productTypeD));

              // Case of value is ignored.
              Assert.True(comparer.Equals(productTypeA, productTypeATitleCase));

              //Null value is handled gracefully.
              Assert.False(comparer.Equals(productTypeA, productTypeE));
              Assert.True(comparer.Equals(productTypeE, productTypeF));
              Assert.True(comparer.Equals(productTypeG, productTypeH));
        }
        public void TestProductTypeGetHashcode()
        {
            ProductType productTypeA = new ProductType() {
            type = ProductDimensionType.BRAND,
            value = "google",
              };

              ProductType productTypeATitleCase = new ProductType() {
            type = ProductDimensionType.BRAND,
            value = "Google",
              };

              ProductType productTypeB = new ProductType() {
            type = ProductDimensionType.BRAND,
            value = "google"
              };

              ProductType productTypeC = new ProductType() {
            type = ProductDimensionType.CHANNEL,
            value = "google"
              };

              ProductType productTypeD = new ProductType() {
            type = ProductDimensionType.BRAND,
            value = "motorola"
              };

              Assert.AreEqual(comparer.GetHashCode(productTypeA), comparer.GetHashCode(productTypeB));
              Assert.AreNotEqual(comparer.GetHashCode(productTypeA), comparer.GetHashCode(productTypeC));
              Assert.AreNotEqual(comparer.GetHashCode(productTypeA), comparer.GetHashCode(productTypeD));

              Assert.AreEqual(comparer.GetHashCode(productTypeA),
              comparer.GetHashCode(productTypeATitleCase));
        }
        public void TestProductTypeEquals()
        {
            ProductType productTypeA = new ProductType() {
            type = ProductDimensionType.BRAND,
            value = "google",
              };

              ProductType productTypeB = ProductDimensions.CreateType(ProductDimensionType.BRAND,
              "google");

              Assert.True(comparer.Equals(productTypeA, productTypeB));

              ProductType productTypeC = new ProductType() {
            type = ProductDimensionType.BRAND,
              };

              ProductType productTypeD = ProductDimensions.CreateType(ProductDimensionType.BRAND);

              Assert.True(comparer.Equals(productTypeC, productTypeD));
        }